Programming Basics SQL HTML CSS JavaScript Python C++ Java JavaFX Swing Problem Solving English English Conversations Computer Fundamentals Learn Typing

SQLنسخ البيانات في جدول آخر

  • طريقة نسخ البيانات من جدول إلى جدول
  • تجهيز قاعدة البيانات التي سنطبق عليها
  • مثال حول إنشاء نسخة من بنية الجدول
  • أمثلة حول نسخ البيانات من جدول إلى جدول

طريقة نسخ البيانات من جدول إلى جدول

قد تحتاج لإنشاء نسخة من الجدول إذا كنت تريد إجراء اختبار ما أو في حال أردت إنشاء نسخة ثانية منه بهدف التدقيق ( Auditing أي لمراقبة أي تعديل يتم في الجدول الأساسي.

لنسخ البيانات من جدول لآخر يجب أن يكون نوع الأعمدة التي سيتم النسخ منها متطابق مع نوع الأعمدة التي سيتم النسخ إليها.

عند نسخ البيانات من جدول لآخر تستطيع تحديد الأسطر و الحقول التي سيتم نسخها، أي لست مجبر على نسخ كل بيانات الجدول في جدول آخر. بالإضافة إلى ذلك فإن نسخ القيم من جدول لآخر لا يؤثر إطلاقاً على القيم الموجودة في الجدول الذي سيتم النسخ إليه.


1- طريقة إنشاء نسخة من بنية الجدول

بشكل عام، يمكنك إنشاء الجدول الذي سيتم وضع نسخة من البيانات فيه باستخدام الأمر CREATE TABLE كما يلي و هذه الطريقة تعمل في جميع أنواع قواعد البيانات.

CREATE TABLE table_name (
column_name_1 datatype,
column_name_2 datatype,
....
);
CREATE TABLE table_name ( column_name_1 datatype, column_name_2 datatype, .... );

بما أننا نسخدم قواعد بيانات MySQL يمكنك استخدام الأسلوب التالي المتاح فيها و الذي يمكن من خلاله بناء نسخة مطابقة من أي جدول بسهولة.

CREATE TABLE new_table LIKE original_table;
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 SELECT * FROM table1 WHERE condition;

إذا كان الجدولين غير متطابقين في البنية، سيكون عليك تحديد الأعمدة التي سيتم النسخ منها و إليها كما لي.

INSERT INTO table2 (column1, column2, column3, ...)
SELECT column1, column2, column3, ...
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);
-- سيتم حذفها 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_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)
);
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 هنا قمنا بتحديد أنه سيتم نسخ كل بيانات الجدول
INSERT INTO employees_copy -- employees_copy هنا قمنا بتحديد أنه سيتم وضع البيانات المنسوخة في الجدول SELECT * FROM employees; -- employees هنا قمنا بتحديد أنه سيتم نسخ كل بيانات الجدول

النتيجة

5 row(s) affected Records: 5 Duplicates

النتيجة تعني أنه تم نسخ البيانات بنجاح في الجدول الجديد.

إذا قمت بعرض جميع البيانات الموجودة في الجدول 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 هنا قمنا بتحديد أنه سيتم نسخ كل بيانات الجدول
INSERT INTO employees_copy -- employees_copy هنا قمنا بتحديد أنه سيتم وضع البيانات المنسوخة في الجدول SELECT * FROM employees; -- employees هنا قمنا بتحديد أنه سيتم نسخ كل بيانات الجدول

النتيجة

Error Code: 1062. Duplicate entry '1' for key 'employees_copy.PRIMARY'

النتيجة تعني أنه فشل في عملية النسخ بسبب أن القيمة 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 هنا قمنا بتحديد أنه سيتم نسخ بيانات أعمدة محددة من الجدول
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