يتم استخدام جملة ON DELETE CASCADE في MySQL تلقائيًا يزيل السجلات المطابقة من الجدول الفرعي عندما نحذف الصفوف من الجدول الأصل. إنه نوع من الإجراء المرجعي المتعلق بـ مفتاح غريب .
لنفترض أننا أنشأنا جدولين باستخدام المفتاح الخارجي في علاقة مفتاح خارجي، مما يجعل كلا الجدولين أصلًا وفرعًا. بعد ذلك، نحدد عبارة ON DELETE CASCADE لمفتاح خارجي واحد يجب تعيينه حتى ينجح الآخر في العمليات المتتالية. إذا تم تعريف ON DELETE CASCADE لجملة FOREIGN KEY واحدة فقط، فستؤدي العمليات المتتالية إلى حدوث خطأ.
MySQL على مثال DELETE CASCADE
دعونا نفهم كيف يمكننا استخدام جملة ON DELETE CASCADE في جدول MySQL. أولا، سنقوم بإنشاء جدولين بالاسم الموظف والدفع . يرتبط كلا الجدولين من خلال مفتاح خارجي مع عملية الحذف المتتالية. هنا، الموظف هو جدول الوالدين ، والدفع هو طاولة الطفل . تقوم البرامج النصية التالية بإنشاء كلا الجدولين مع سجلاتهما.
الجدول: الموظف
العبارة التالية تنشئ جدول الموظف:
CREATE TABLE Employee ( emp_id int(10) NOT NULL, name varchar(40) NOT NULL, birthdate date NOT NULL, gender varchar(10) NOT NULL, hire_date date NOT NULL, PRIMARY KEY (emp_id) );
بعد ذلك، قم بتنفيذ استعلام الإدراج لملء السجلات.
INSERT INTO Employee (emp_id, name, birthdate, gender, hire_date) VALUES (101, 'Bryan', '1988-08-12', 'M', '2015-08-26'), (102, 'Joseph', '1978-05-12', 'M', '2014-10-21'), (103, 'Mike', '1984-10-13', 'M', '2017-10-28'), (104, 'Daren', '1979-04-11', 'M', '2006-11-01'), (105, 'Marie', '1990-02-11', 'F', '2018-10-12');
قم بتنفيذ استعلام SELECT للتحقق من البيانات في جدول، والذي يمكن أن يظهر أدناه:
الجدول: الدفع
البيان أدناه ينشئ جدول الدفع:
CREATE TABLE Payment ( payment_id int(10) PRIMARY KEY NOT NULL, emp_id int(10) NOT NULL, amount float NOT NULL, payment_date date NOT NULL, FOREIGN KEY (emp_id) REFERENCES Employee (emp_id) ON DELETE CASCADE );
التالي، تنفيذ إدراج بيان لملء السجلات في الجدول.
الفرق بين $ و$$
INSERT INTO Payment (payment_id, emp_id, amount, payment_date) VALUES (301, 101, 1200, '2015-09-15'), (302, 101, 1200, '2015-09-30'), (303, 101, 1500, '2015-10-15'), (304, 101, 1500, '2015-10-30'), (305, 102, 1800, '2015-09-15'), (306, 102, 1800, '2015-09-30');
قم بتنفيذ استعلام SELECT للتحقق من البيانات في جدول، والذي يمكن أن يظهر أدناه:
دعنا يمسح البيانات من الجدول الأصل الموظف. للقيام بذلك، قم بتنفيذ العبارة التالية:
mysql> DELETE FROM Employee WHERE emp_id = 102;
البيان أعلاه سوف يحذف سجلات الموظفين الذين emp_id = 102 و مرجع البيانات في الجدول الفرعي. يمكننا التحقق من البيانات باستخدام عبارة SELECT التي ستعطي المخرجات التالية:
في الإخراج أعلاه، يمكننا أن نرى أن جميع الصفوف التي تشير إلى emp_id = 102 تم حذفها تلقائيًا من كلا الجدولين.
كيف يمكن العثور على الجدول المتأثر من خلال إجراء ON DELETE CASCADE؟
في بعض الأحيان، قبل حذف السجلات من الجدول، نريد معرفة الجدول المتأثر من خلال الإجراء المرجعي ON DELETE CASCADE. يمكننا العثور على هذه المعلومات عن طريق الاستعلام من القيود المرجعية في قاعدة بيانات information_schema على النحو التالي:
تحويل عدد صحيح إلى سلسلة جافا
USE information_schema; SELECT table_name FROM referential_constraints WHERE constraint_schema = 'database_name' AND referenced_table_name = 'parent_table' AND delete_rule = 'CASCADE'
يُنتج البيان أدناه النتيجة حول الجداول المرتبطة بجدول الموظف مع قاعدة ON DELETE CASCADE في com.employeedb قاعدة البيانات:
USE information_schema; SELECT table_name FROM referential_constraints WHERE constraint_schema = 'employeedb' AND referenced_table_name = 'Employee' AND delete_rule = 'CASCADE';
بعد تنفيذ الأمر أعلاه، سنحصل على الإخراج أدناه:
MySQL في حالة التحديث المتتالي
عند تحديث جملة CASCADE في ماي إس كيو إل يستخدم ل تحديث السجلات المطابقة من الجدول الفرعي تلقائيًا عندما نقوم بتحديث الصفوف في الجدول الأصلي. والمثال التالي يشرح ذلك بشكل أكثر وضوحا.
أولا، نحن بحاجة إلى استخدام تغيير الجدول بيان لإضافة جملة ON UPDATE CASCADE في جدول الدفع على النحو التالي:
ALTER TABLE Payment ADD CONSTRAINT `payment_fk` FOREIGN KEY(emp_id) REFERENCES Employee (emp_id) ON UPDATE CASCADE;
سوف يعطي الإخراج التالي:
في البرنامج النصي أدناه، سنقوم بتحديث معرف الموظف في الجدول الأصلي، وسيعكس هذا التغيير تلقائيًا في الجدول الفرعي أيضًا:
mysql> UPDATE Employee SET emp_id = 102 WHERE emp_id = 103;
بالتحقق من محتوى جدول الموظف والمدفوعات سنرى ذلك emp_id سيتم تحديث قيم العمود بنجاح.