logo

MySQL ב-DELETE CASCADE

ON DELETE CASCADE סעיף ב-MySQL משמש באופן אוטומטי לְהַסִיר הרשומות התואמות מטבלת הילד כאשר אנו מוחקים את השורות מטבלת האב. זוהי מעין פעולת התייחסות הקשורה ל מפתח זר .

נניח שיצרנו שתי טבלאות עם FOREIGN KEY ביחסי מפתח זר, מה שהופך את שתי הטבלאות להורה וילד. לאחר מכן, אנו מגדירים משפט ON DELETE CASCADE עבור FOREIGN KEY אחד שיש להגדיר כדי שהשני יצליח בפעולות המדורגות. אם 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 כדי לאמת את הנתונים לטבלה, אותה ניתן להציג להלן:

MySQL ב-DELETE CASCADE

טבלה: תשלום

ההצהרה שלהלן יוצרת טבלה תשלום:

 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 CASCADE

תן לנו לִמְחוֹק נתונים מטבלת האב עובד. לשם כך, בצע את ההצהרה הבאה:

 mysql> DELETE FROM Employee WHERE emp_id = 102; 

ההצהרה הנ'ל תמחק את רישומי העובדים שלהם emp_id = 102 ו מפנה נתונים לטבלת הילד. אנו יכולים לאמת את הנתונים באמצעות המשפט SELECT שייתן את הפלט הבא:

MySQL ב-DELETE CASCADE

בפלט לעיל, אנו יכולים לראות שכל השורות המתייחסות ל-emp_id = 102 נמחקו אוטומטית משתי הטבלאות.

כיצד למצוא את הטבלה המושפעת על ידי פעולת ON DELETE CASCADE?

לפעמים, לפני מחיקת רשומות מהטבלה, אנו רוצים לדעת את הטבלה המושפעת על ידי פעולת ההתייחסות ON DELETE CASCADE. אנו יכולים למצוא מידע זה על ידי שאילתה מהאילוצים referential_constraints במסד הנתונים 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 ב- עובדדב מאגר מידע:

 USE information_schema; SELECT table_name FROM referential_constraints WHERE constraint_schema = 'employeedb' AND referenced_table_name = 'Employee' AND delete_rule = 'CASCADE'; 

לאחר ביצוע הפקודה לעיל, נקבל את הפלט שלהלן:

MySQL ב-DELETE CASCADE

MySQL בעדכון CASCADE

ON עדכון CASCADE סעיף ב MySQL רגיל ל עדכון הרשומות התואמות מטבלת הילד באופן אוטומטי כאשר אנו מעדכנים את השורות בטבלת האב. הדוגמה הבאה מסבירה זאת בצורה ברורה יותר.

ראשית, עלינו להשתמש ב- שינוי טבלה הצהרה כדי להוסיף את סעיף ON UPDATE CASCADE בטבלה תשלום כמפורט להלן:

 ALTER TABLE Payment ADD CONSTRAINT `payment_fk` FOREIGN KEY(emp_id) REFERENCES Employee (emp_id) ON UPDATE CASCADE; 

זה ייתן את הפלט הבא:

MySQL ב-DELETE CASCADE

בסקריפט שלהלן, נעדכן את מזהה העובד בטבלת האב, והוא ישקף אוטומטית את השינוי הזה גם בטבלת הילד:

 mysql> UPDATE Employee SET emp_id = 102 WHERE emp_id = 103; 

אימות התוכן של טבלת עובדים ותשלומים, נראה זאת emp_id ערכי העמודות יעודכנו בהצלחה.

MySQL ב-DELETE CASCADE