כיצד להשתמש במגבלות מפתח זרות של MySQL

How Use Mysql Foreign Key Constraints



אילוץ המפתח הזר משמש ליצירת קשר בין שתי טבלאות במסד הנתונים של MySQL. זוהי תכונה חשובה מאוד של MySQL להגדיר סוגים שונים של הגבלות על הטבלאות הקשורות. כדי להגדיר כל אילוץ מפתח זר עבור כל טבלה עליך להשתמש במפתח הראשי של טבלה אחרת. המפתח הראשי הוא מפתח ייחודי לטבלה לזיהוי השורה הספציפית בטבלה וכאשר מפתח ראשי זה משמש לטבלה אחרת כדי ליצור מערכת יחסים של אחד לאחד או אחד לרבים או רבים לרבים אז היא נקרא מפתח לועזי. המאפיינים של מפתחות זרים וכיצד ניתן להשתמש במפתחות אלה בטבלאות MySQL מוצגים במאמר זה.

תכונות של מגבלות מפתח זרות:

כמה מאפיינים חשובים של אילוץ מפתחות זרים מוסברים להלן.







  • סוג הנתונים של המפתח הזר המשמש בטבלת הצאצא חייב להיות זהה לסוג הנתונים של המפתח הראשי המשמש בטבלת האב להפניה של המפתח הזר.
  • ניתן להתייחס לכל עמודת אינדקס או עמודות מרובות כמפתח זר לטבלת InnoDB בלבד.
  • הרשאות הפניה או לפחות אחת מההרשאות של הצהרות SELECT, INSERT, UPDATE ו- DELETE נדרשות ליצירת מפתח זר.
  • ניתן ליצור מפתח זר בשתי דרכים. אחד באמצעות הצהרת CREATE ואחר באמצעות משפט ALTER.

תְנַאִי מוּקדָם:

לפני יצירת אילוץ מפתח זר, עליך ליצור מסד נתונים וטבלת אב עם המפתח הראשי. נניח ששם מסד הנתונים הוא ' סִפְרִיָה 'והוא מכיל שתי טבלאות אב בשם' ספרים 'ו-' לוֹוֶה '. צור חיבור עם שרת MySQL באמצעות mysql הלקוח והפעל את משפטי ה- SQL הבאים ליצירת מסד הנתונים והטבלאות.



לִיצוֹר מאגר מידע סִפְרִיָה;
להשתמש סִפְרִיָה;

לִיצוֹר שולחן ספרים(
תְעוּדַת זֶהוּת INT לֹא ריק AUTO_INCREMENT ,
כותרת varchar (חמישים) לֹא ריק ,
מְחַבֵּר varchar (חמישים) לֹא ריק ,
מוֹצִיא לָאוֹר varchar (חמישים) לֹא ריק ,
מפתח ראשי (תְעוּדַת זֶהוּת)
) מנוע = INNODB ;

לִיצוֹר שולחן לווים(
תְעוּדַת זֶהוּת VARCHAR (חמישים) לֹא ריק ,
שֵׁם varchar (חמישים) לֹא ריק ,
כתובת varchar (חמישים) לֹא ריק ,
אימייל varchar (חמישים) לֹא ריק ,
מפתח ראשי (תְעוּדַת זֶהוּת)
) מנוע = INNODB ;



הגדר אילוץ מפתח זר באמצעות הצהרת CREATE

צור טבלה בשם ' book_lorrow_info 'עם אילוצי מפתח זרים על ידי ביצוע ההצהרה הבאה. הנה ה book_id השדה הוא א מפתח זר עבור טבלה זו וכל ערך של שדה זה חייב להתקיים ב תְעוּדַת זֶהוּת שדה של ספרים שולחן. ספרים הוא שולחן האב ו book_lorrow_info הוא שולחן הילדים. שתי מגבלות נקבעות גם עם המפתח הזר כאן. אלו הם מחק CASCADE ו עדכן CASCADE . כלומר אם מפתח ראשי כלשהו יוסר או יתעדכן מטבלת האב אז הרשומות המתאימות הקשורות לטבלת ילדים הקשורות למפתח הזר יוסרו או שהמפתח הזר יעודכן.





לִיצוֹר שולחן book_lorrow_info(
לווה_ייד VARCHAR (חמישים),
book_id INT ,
לווה_תאריך תַאֲרִיך לֹא ריק ,
תאריך חזרה תַאֲרִיך לֹא ריק ,
סטָטוּס VARCHAR (חֲמֵשׁ עֶשׂרֵה) לֹא ריק ,
אינדקס par_ind(book_id),
מפתח ראשי (לווה_ייד,לווה_תאריך),
מפתח זר (book_id) הפניות ספרים(תְעוּדַת זֶהוּת)
עַל לִמְחוֹק אֶשֶׁד
עַל עדכון אֶשֶׁד
) מנוע = INNODB ;

כעת, הפעל את משפטי ה- SQL הבאים כדי להוסיף כמה רשומות בשתי הטבלאות. הצהרת INSERT הראשונה תוסיף ארבע רשומות ספרים שולחן. ארבעת הערכים של תְעוּדַת זֶהוּת שדה של ספרים הטבלה תהיה 1, 2, 3 ו -4 עבור התכונה Auto-increment. הצהרת INSERT השנייה תוסיף ארבע רשומות book_lorrow_info מבוסס על ה תְעוּדַת זֶהוּת ערך של ספרים שולחן.



לְהַכנִיס לְתוֹך ספרים ערכים
( ריק , 'אל תיגע בזמיר', 'הארפר לי', הוצאת גרנד סנטרל),
( ריק , 'מאה שנים של בדידות', 'גרסיה מרקס', 'לוטפי אוזקוק'),
( ריק , 'מעבר להודו', 'פורסטר, א.מ.', 'ספריית התמונות של BBC Hulton'),
( ריק , 'איש בלתי נראה', 'ראלף אליסון', 'Encyclopædia Britannica, Inc.');

לְהַכנִיס לְתוֹך book_lorrow_info ערכים
('123490', 1, '2020-02-15', '2020-02-25', 'חזר'),
('157643', 2, '2020-03-31', '2020-03-10', 'ממתין ל'),
('174562', 4, '2020-04-04', '2020-04-24', 'שָׁאוּל'),
('146788', 3, '2020-04-10', '2020-01-20', 'שָׁאוּל');

אם תנסה להכניס ערך לשדה המפתח הזר של טבלת הצאצא שאינו קיים בשדה המפתח הראשי של טבלת האב אז MySQL תיצור שגיאה. משפט SQL הבא יוצר שגיאה מכיוון שטבלת האב, ספרים אינו מכיל ערך מזהה כלשהו 10 .

לְהַכנִיס לְתוֹך book_lorrow_info ערכים
('195684', 10, '2020-04-15', '2020-04-30', 'חזר');

לאחר ביצוע משפט DELETE הבא, כאשר הרשומה הרביעית תוסר מה- ספרים שולחן ואז את הרשומות הקשורות מתוך book_lorrow_info הטבלה תוסר באופן אוטומטי בגלל אילוץ המפתח הזר.

לִמְחוֹק מ ספרים איפה תְעוּדַת זֶהוּת= 4;
בחר * מ ספרים;
בחר * מ book_lorrow_info;

הגדר אילוץ מפתח זר באמצעות הצהרת ALTER

בהתחלה, הכנס כמה רשומות לווים טבלה וטבלה זו תוגדר כטבלת אב בטבלה הבאה גיל הַצהָרָה.

לְהַכנִיס לְתוֹך לווים ערכים
('123490', 'פטריק ווד', 'רחוב ווסט 34 LANCASTER LA14 9ZH', '[מוגן בדוא'ל]'),
('157643', 'עזרא מרטין', '10 The Grove BIRMINGHAM B98 1EU ', '[מוגן בדוא'ל]'),
('174562', 'ג'ון אינס ארצ'י', '55 כביש ראשי LIVERPOOL L2 3OD ', '[מוגן בדוא'ל]'),
('146788', 'פרידריך הנסון', '85 Highfield Road SHREWSBURY SY46 3ME ', '[מוגן בדוא'ל]');

הפעל את הפעולות הבאות גיל הצהרה לקבוע אילוץ נוסף למפתח זר book_lorrow_info שולחן כדי ליצור את הקשר לווים שולחן. פה, לווה_ייד מוגדר כמפתח זר עבור book_lorrow_info שולחן.

שנה טבלה book_borrow_info הוסף CONSTRAINT fk_lower
מפתח זר(לווה_ייד)הפניות לווים(תְעוּדַת זֶהוּת)על מחיקת CASCADE בהגבלת עדכון;

כעת, הכנס רשומה book_lorrow_info עם תקף לווה_ייד ערך שקיים ב תְעוּדַת זֶהוּת שדה של לווים שולחן. 157643 ערך קיים בטבלת הלווים והצהרת INSERT הבאה תבוצע בהצלחה.

לְהַכנִיס לְתוֹך book_lorrow_info ערכים
('157643', 1, '2020-03-10', '2020-03-20', 'חזר');

משפט INSERT הבא יפיק הודעת שגיאה מכיוון שערך המזהה 195680 אינו קיים בטבלת הלווים.

לְהַכנִיס לְתוֹך book_lorrow_info ערכים
('195680', 1, '2020-04-15', '2020-04-30', 'חזר');

סיכום:

הגדרה נכונה של אילוצי מפתח זרים היא משימה חשובה ביותר ליצירת מאגר מידע יחסי וניהול נתונים בין הטבלאות בצורה נכונה. הכרת השימושים באילוצי מפתחות זרים חיונית מאוד למעצבי מסדי נתונים. אני מקווה שמאמר זה יעזור למעצבי מסדי הנתונים החדשים להבין את הרעיון של אילוצי מפתח זרים וליישם אותם כראוי במשימותיהם.