מדריך SQL – קשרים בין טבלאות, מפתח ראשי ומפתח זר

‏ • Microsoft

עד לשלב זה במדריך SQL, עבדנו על טבלה אחת בודד ששומרת את פרטי המוצרים בחנות:

מדריך SQL - קשרים בין טבלאות, מפתח ראשי ומפתח זר 

מפתח ראשי של טבלה (Primary Key)

כמעט לכל טבלה נרצה להגדיר מפתח ראשי (PK). המפתח הראשי הוא עמודה אחת או יותר, שבעזרתן ניתן לזהות את הרשומה באופן חד-חד-ערכי. במקרה שלנו – לכל מוצר בחנות יש קוד מוצר שהוא ייחודי אך ורק לאותו מוצר. הקוד 1 מסמל ביסלי, ולביסלי יש קוד יחיד שהוא 1.

דוגמאות נוספות יכולות להיות:

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

הגדרת מפתח ראשי לטבלה בתוך WebMatrix

כדי להגדיר מפתח ראשי לטבלה, נבחר אותה ברשימת הטבלאות, ונעבור לתצוגת ה- Definition.

מדריך SQL - קשרים בין טבלאות, מפתח ראשי ומפתח זר

 

נבחר את השדה שנרצה שישמש כמפתח ראשי של הטבלה (במקרה שלנו – שדה ה- ProductID), ונשנה את המאפיין Is Primary Key להיות True.

מדריך SQL - קשרים בין טבלאות, מפתח ראשי ומפתח זר

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

לסיום הפעולה ושמירת השינוי נלחץ על כפתור ה- Save.

מדריך SQL - קשרים בין טבלאות, מפתח ראשי ומפתח זר

יצירת טבלה חדשה

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

נגדיר את הטבלה החדשה הבאה:

ראשית נלחת על כפתור ה- New Table בסרגל הכלים העליון, כדי ליצור טבלה חדשה:

מדריך SQL - קשרים בין טבלאות, מפתח ראשי ומפתח זר

נגדיר את העמודה OrderID – קוד ההזמנה, שתהיה המפתח הראשי של הטבלה.

מדריך SQL - קשרים בין טבלאות, מפתח ראשי ומפתח זר

 

העמודה ProductID תשמור את קוד הפריט להזמנה:

מדריך SQL - קשרים בין טבלאות, מפתח ראשי ומפתח זר

העמודה Units תשמור את מספר היחידות להזמנה מהפריט.

מדריך SQL - קשרים בין טבלאות, מפתח ראשי ומפתח זר

 

עד כאן, הגדרת העמודות בטבלה צריכה להיראות כך:

image

לסיום, נשמור את הטבלה החדשה בשם Orders.

מדריך SQL - קשרים בין טבלאות, מפתח ראשי ומפתח זר

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

מדריך SQL - קשרים בין טבלאות, מפתח ראשי ומפתח זר

  • בהזמנה מספר 1 הוזמנו 3 יחידות מפריט עם קוד 1 (ביסלי), ובהזמנה מספר 2 הוזמנו 2 יחידות של אותו פריט.

  • בהזמנה מספר 3 הוזמנו 7 יחידות מפריט עם קוד 7 (כיף כיף), ובהזמנה 7 הוזמנו 7 יחידות של אותו פריט.

 

שימו לב! בהזמנה 6 הוזמנו 3 יחידות מפריט שהקוד שלו הוא 5. מבט חטוף בטבלת הפריטים יגלה לנו שלא קיים שם פריט כזה. איך נוכל לוודא שטבלת ההזמנות תכיל הזמנות רק של פריטים שקיימים בחנות? לשם כך, נכיר את השימוש במפתח זר (Foreign Key).

 

הגדרת הקשר בין הטבלאות – שימוש במפתח זר (Foreign Key)

ציינו קודם שהשדה ProductID הוא המפתח הראשי של טבלת Products, והוא מזהה באופן ייחודי כל פריט בטבלה. עוד ציינו שבטבלת ההזמנות יש שדה בשם ProductID שמכיל קוד פריט שצריך להתאים לרשימת המוצרים בטבלת המוצרים. לא יכול להיות שיוזמן מוצר שלא קיים.

נגדיר קשר בין טבלת ההזמנות לטבלת המצרים שאומר את הדבר הבא:

  • לכל רשומה חדשה בטבלת Orders, הערך שמוזן בעמודה ProductID חייב להיות קיים בטבלת Products.

הגדרה זו מגדירה מפתח זר – ערך בעמודה כלשהי (ProductID) בטבלה (Orders) צריך להופיע בטבלה אחרת (Products) שם הוא משמש כמפתח ראשי.

 

נפתח את הטבלה Orders בתצוגת Definition, ובסרגל הכלים העליון נלחץ על הכפתור New Relationship.

מדריך SQL - קשרים בין טבלאות, מפתח ראשי ומפתח זר

במסך שנפתח,בצד השמאלי (Foreign Key Table) מופיעה הטבלה Orders ורשימת השדות שלה, כאשר ליד השדה OrderID מופיע סימון שהוא מפתח ראשי.

מדריך SQL - קשרים בין טבלאות, מפתח ראשי ומפתח זר

נבחר בצד ימין את טבלת ה- Products, ורשימת השדות שלה יופיעו גם כן, כאשר השדה ProductID מסומן כמפתח ראשי.

נסמן בשתי הטבלאות את השדה ProductID על מנת להגדיר את הקשר הרצוי בין הטבלאות ונלחץ על OK.

מדריך SQL - קשרים בין טבלאות, מפתח ראשי ומפתח זר

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

כאשר נעשה זאת, נקבל את הודעת השגיאה הבאה:

מדריך SQL - קשרים בין טבלאות, מפתח ראשי ומפתח זר

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

כדי לעשות זאת, נפתח את טבלת Orders בתצוגת Data.

מדריך SQL - קשרים בין טבלאות, מפתח ראשי ומפתח זר

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

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

מדריך SQL - קשרים בין טבלאות, מפתח ראשי ומפתח זר

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

מדריך SQL - קשרים בין טבלאות, מפתח ראשי ומפתח זר

בפרק הבא נכיר את פקודת ה- JOIN שמאפשרת לנו לשלוף נתונים ע”י שילוב בין מספר טבלאות.

תגיות: , ,

גיא בורשטיין

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

תגובות בפייסבוק