SQLنسخ البيانات في جدول آخر
- طريقة نسخ البيانات من جدول إلى جدول
- تجهيز قاعدة البيانات التي سنطبق عليها
- مثال حول إنشاء نسخة من بنية الجدول
- أمثلة حول نسخ البيانات من جدول إلى جدول
طريقة نسخ البيانات من جدول إلى جدول
قد تحتاج لإنشاء نسخة من الجدول إذا كنت تريد إجراء اختبار ما أو في حال أردت إنشاء نسخة ثانية منه بهدف التدقيق ( Auditing )، أي لمراقبة أي تعديل يتم في الجدول الأساسي.
لنسخ البيانات من جدول لآخر يجب أن يكون نوع الأعمدة التي سيتم النسخ منها متطابق مع نوع الأعمدة التي سيتم النسخ إليها.
عند نسخ البيانات من جدول لآخر تستطيع تحديد الأسطر و الحقول التي سيتم نسخها، أي لست مجبر على نسخ كل بيانات الجدول في جدول آخر. بالإضافة إلى ذلك فإن نسخ القيم من جدول لآخر لا يؤثر إطلاقاً على القيم الموجودة في الجدول الذي سيتم النسخ إليه.
1- طريقة إنشاء نسخة من بنية الجدول
بشكل عام، يمكنك إنشاء الجدول الذي سيتم وضع نسخة من البيانات فيه باستخدام الأمر CREATE TABLE
كما يلي و هذه الطريقة تعمل في جميع أنواع قواعد البيانات.
CREATE TABLE table_name ( column_name_1 datatype, column_name_2 datatype, .... );
بما أننا نسخدم قواعد بيانات MySQL يمكنك استخدام الأسلوب التالي المتاح فيها و الذي يمكن من خلاله بناء نسخة مطابقة من أي جدول بسهولة.
CREATE TABLE new_table LIKE original_table;
- مكان الكلمة
original_table
نضع إسم الجدول الذي نريد إنشاء نسخة منه. - مكان الكلمة
new_table
نضع إسم الجدول الجديد الذي نريد إنشاؤه.
النسخة التي يتم بناؤها من الجدول الأصلي تتضمن نفس أسماء و خصائص أعمدته بالإضافة لأي فهرس موجود فيه.
2- طريقة نسخ البيانات في الجدول الثاني
نسخ البيانات من جدول لآخر يتم من خلال إحضارها من الجدول الأصلي بواسطة الأمر SELECT
و إضافتها في الجدول الآخر بواسطة الأمر INSERT INTO
.
إذا كان الجدولين متطابقين في البنية، سيكون شكل الإستعلام سيكون كما يلي.
INSERT INTO table2 SELECT * FROM table1 WHERE condition;
إذا كان الجدولين غير متطابقين في البنية، سيكون عليك تحديد الأعمدة التي سيتم النسخ منها و إليها كما لي.
INSERT INTO table2 (column1, column2, column3, ...) SELECT column1, column2, column3, ... FROM table1 WHERE condition;
- مكان الكلمة
table1
نضع إسم الجدول الذي سننسخ البيانات منها. - مكان الكلمة
table2
نضع إسم الجدول الذي سننسخ البيانات فيه. - بعد الكلمة
WHERE
يمكننا وضع شروط لتحديد القيم التي سيتم نسخها من الجدولtable1
.
تجهيز قاعدة البيانات التي سنطبق عليها
قم بتنفيذ الإستعلام التالي حتى تنشئ قاعدة بيانات جديدة إسمها harmash
و فيها جدول إسمه employees
يحتوي على بيانات 5 موظفين..
مثال
-- سيتم حذفها harmash في حال كان يوجد بالأساس قاعدة بيانات إسمها DROP DATABASE IF EXISTS harmash; -- harmash هنا قمنا بإنشاء قاعدة بيانات جديدة إسمها CREATE DATABASE harmash; -- harmash هنا قمنا بتحديد أن أي إستعلام جديد سيتم تنفيذه على قاعدة البيانات USE harmash; -- يتألف من 5 أعمدة employees هنا قمنا بإنشاء جدول جديد إسمه -- لأننا قمنا بتحديدها قبل إستدعاء هذا الأمر harmash سيتم إنشاء هذا الجدول بداخل قاعدة البيانات CREATE TABLE employees ( id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL, gender VARCHAR(20), country VARCHAR(50), salary DECIMAL(7,2) ); -- employees هنا قمنا بإضافة 5 أسطر في الجدول -- لاحظ أننا لم نحدد أسماء الأعمدة التي سنضع فيها البيانات لأننا قمنا بملئ جميع المعلومات -- مكان كل حقل لن نقوم بوضع قيمة فيه null بما أننا لم نحدد أسماء الأعمدة التي سنملأها لاحظ أننا مجبورين على وضع كلمة -- الموضوعة في بداية كل أمر سيتم إستبدالها بترقيم تلقائي من قبل قاعدة البيانات null و لا تنسى أن الكلمة INSERT INTO employees VALUES (null, "rami", "male", "Lebanon", 700); INSERT INTO employees VALUES (null, "ahmad", "male", "Syria", 800); INSERT INTO employees VALUES (null, "hanan", "female", "KSA", 750); INSERT INTO employees VALUES (null, "saly", "female", "Lebanon", 650); INSERT INTO employees VALUES (null, "samir", "male", "Egypt", 600);
فيما يلي البيانات التي قمنا بإضافتها في الجدول employees
.
id | user | gender | country | salary |
---|---|---|---|---|
1 | rami | male | Lebanon | 700.00 |
2 | ahmad | male | Syria | 800.00 |
3 | hanan | female | KSA | 750.00 |
4 | saly | female | Lebanon | 650.00 |
5 | samir | male | Egypt | 600.00 |
مثال حول إنشاء نسخة من بنية الجدول
الإستعلام التالي يقوم بإنشاء نسخة من بنية الجدول employees
في نفس قاعدة البيانات و إسمها employees_copy
.
مثال
في قواعد بيانات MySQL يمكنك استخدام الأسلوب التالي.
CREATE TABLE employees_copy LIKE employees;
أو يمكنك تعريف الجدول الجديد تماماً كما قمت بتعريف الجدول الأصلي كما يلي.
CREATE TABLE employees ( id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL, gender VARCHAR(20), country VARCHAR(50), salary DECIMAL(7,2) );
الجدول الذي employees_copy
الذي قمنا بإنشائه سيكون مشابه للجدول الأصلي و لكنه فارغ كما يلي.
id | user | gender | country | salary |
---|---|---|---|---|
أمثلة حول نسخ البيانات من جدول إلى جدول
الإستعلام التالي يقوم بنسخ كل البيانات الموجودة في الجدول employees
و يضيفها في الجدول employees_copy
.
المثال الأول
INSERT INTO employees_copy -- employees_copy هنا قمنا بتحديد أنه سيتم وضع البيانات المنسوخة في الجدول SELECT * FROM employees; -- employees هنا قمنا بتحديد أنه سيتم نسخ كل بيانات الجدول
النتيجة
النتيجة تعني أنه تم نسخ البيانات بنجاح في الجدول الجديد.
إذا قمت بعرض جميع البيانات الموجودة في الجدول employees_copy
فتسجد أنه أصبح عبارة نسخة مطابقة للجدول employees
.
id | user | gender | country | salary |
---|---|---|---|---|
1 | rami | male | Lebanon | 700.00 |
2 | ahmad | male | Syria | 800.00 |
3 | hanan | female | KSA | 750.00 |
4 | saly | female | Lebanon | 650.00 |
5 | samir | male | Egypt | 600.00 |
إذا حاولت إضافة الأسطر نفسها في الجدول employees_copy
من جديد سيظهر لك الخطأ Duplicate entry '1' for key 'PRIMARY' و الذي يعني أنه لا يمكنك إعادة إضافة البيانات من جديد بسبب أن الحقل id
ممنوع أن يكون فيه قيم مكررة.
للدقة أكثر فإنه بمجرد محاولة وضع العدد 1
من جديد في العمود id
فإن خادم قاعدة البيانات سيمنع ذلك.
الإستعلام التالي يحاول إعادة نسخ كل البيانات الموجودة في الجدول employees
و إضافتها في الجدول employees_copy
من جديد.
المثال الثاني
INSERT INTO employees_copy -- employees_copy هنا قمنا بتحديد أنه سيتم وضع البيانات المنسوخة في الجدول SELECT * FROM employees; -- employees هنا قمنا بتحديد أنه سيتم نسخ كل بيانات الجدول
النتيجة
النتيجة تعني أنه فشل في عملية النسخ بسبب أن القيمة 1 لا يمكن تكرارها في العمود id
.
لحل المشكلة السابقة، يمكنك تحديد أي أعمدة تريد أن يتم النسخ من الجدول employees
و في أي أعمدة سيتم إضافتها في الجدول employees_copy
.
تذكر: تستطيع إعادة نسخ جميع البيانات باستثناء البيانات التي يمكن أن يتم تكرارها في العمود.
الإستعلام التالي يقوم بنسخ كل القيم الموجودة في الجدول employees
باستثناء القيم الموضوعة في العمود id
.
ما فعلناه هنا، هو ترك قاعدة البيانات تقوم بإعطاء القيم بشكل تلقائي للعمود id
لكل سطر يتم إضافته لأن نوع العمود بالأساس هو AUTO_INCREMENT
و هكذا سنتمكن من نسخ كل القيم من جديد في الجدول employees
بدون أي مشاكل.
المثال الثالث
INSERT INTO employees_copy(username, gender, country, salary) -- employees_copy هنا قمنا بتحديد أنه سيتم وضع البيانات المنسوخة في أعمدة محددة في الجدول SELECT username, gender, country, salary FROM employee; -- employee هنا قمنا بتحديد أنه سيتم نسخ بيانات أعمدة محددة من الجدول
إذا قمت بعرض جميع البيانات الموجودة في الجدول employees_copy
فتسجد أنه تم إضافة بيانات الجدول employees
فيه من جديد و لكن هذه المرة تم إعطاء رقم تعرفة id
مختلف لكل سطر بشكل تلقائي.
id | user | gender | country | salary |
---|---|---|---|---|
1 | rami | male | Lebanon | 700.00 |
2 | ahmad | male | Syria | 800.00 |
3 | hanan | female | KSA | 750.00 |
4 | saly | female | Lebanon | 650.00 |
5 | samir | male | Egypt | 600.00 |
6 | rami | male | Lebanon | 700.00 |
7 | ahmad | male | Syria | 800.00 |
8 | hanan | female | KSA | 750.00 |
9 | saly | female | Lebanon | 650.00 |
10 | samir | male | Egypt | 600.00 |