PracticU

יצירת קשר יחיד-לרבים
ב-SQL

בלי כתוביותעם כתוביות
PracticU › קורס DBA אפליקטיבי - שפת SQL למתחילים › יצירת קשר יחיד-לרבים ב-SQL
מילון מושגים:
טבלה - מבנה במסד נתונים שמאחסן נתונים בשורות ועמודות. כל שורה היא רשומה וכל עמודה היא שדה.
מפתח זר - עמודה בטבלה שמפנה למפתח הראשי בטבלה אחרת, ובכך יוצרת קשר בין הטבלאות.
עמודה - שדה בטבלת מסד נתונים שמחזיק ערך מסוג מסוים עבור כל שורה, למשל שם או תאריך.
מפתח ראשי - עמודה או צירוף עמודות שמזהים באופן ייחודי כל שורה בטבלת מסד נתונים.
DELETE - פקודת SQL למחיקת שורות מטבלה. גם שיטת HTTP לבקשת מחיקה של משאב בשרת.
מסד נתונים - אוסף מאורגן של נתונים המאוחסן כך שאפשר לשמור, לחפש, לעדכן ולשלוף אותו ביעילות, לרוב באמצעות שפת שאילתות.
טופס - אזור בממשק שבו המשתמש מזין נתונים בשדות ושולח אותם, למשל טופס הרשמה או התחברות.

יצירת קשר יחיד-לרבים ב-SQL
הקשר בין שתי טבלאות הוא מה שמונע מהדאטאבייס לקבל מפתח זר שלא קיים. כאן מגדירים קשר כזה בין Cities ל-Students בשתי דרכים ובודקים איך הוא מגן על המידע.
השלבים העיקריים
1. להכין מידע חוקי: אי אפשר ליצור קשר כשיש נתונים שמפרים אותו. לכן מחזירים את ערכי CityID לערכים שקיימים בטבלת הערים. בדרך כלל בונים קודם את הקשרים ורק אחר כך מכניסים מידע.
2. דרך ראשונה, מתוך Design: בטבלת Students פותחים Design, אחר כך Relationships ו-Add. בוחרים את Cities כטבלה עם המפתח הראשי ואת Students כטבלה עם המפתח הזר, בשתיהן העמודה CityID. הקשר תמיד בין מפתח ראשי למפתח זר.
3. כללי Delete ו-Update: באזור insert and update specifications יש ארבע אפשרויות. Set Null, Set Default, No Action ו-Cascade. בטבלת ליסטינג בוחרים No Action, כדי שמחיקת עיר לא תמחק את התלמידים שלה. Update בדרך כלל זהה, כי לא מעדכנים מפתחות ראשיים.
4. בדיקה: עדכון תלמיד לעיר 8 או הוספת תלמידה לעיר 13 נכשלים בשגיאת Foreign Key. מחיקת עיר שיש בה תלמידים נחסמת, ועיר בלי תלמידים נמחקת. מחיקת תלמיד לא פוגעת בערים.
5. דרך שנייה, דיאגרמה: מוחקים את הקשר, יוצרים Database Diagram ומוסיפים את הטבלאות. גוררים מ-CityID בטבלה עם המפתח הראשי אל CityID בטבלה עם המפתח הזר. הטופס נפתח עם הערכים מוכנים, משאירים No Action. הדיאגרמה מוצגת כקשר יחיד-לרבים ואפשר לשמור אותה.
שימו לב
- הכיוון חשוב: מתחילים לגרור מהמפתח הראשי.
- אחרי שגיאה המספור האוטומטי מדלג על מספר. אין צורך לטפל בזה.
עכשיו אפשר לחבר טבלת ליסטינג לטבלה אחרת בקשר יחיד-לרבים שמגן על תקינות המידע.
השיעור הבא בקורס: יצירת טבלת פירוט Cascade Delete SQL

פרקי ההרצאה: יצירת קשר יחיד-לרבים ב-SQL

  1. 00:00

    הוספת Relation בין טבלאות

  2. 00:53

    שתי דרכים ליצירת הקשר

  3. 02:06

    הגדרת הקשר בין המפתחות

  4. 03:05

    Insert ו-Update Specifications

  5. 03:57

    אפשרויות מחיקה Set Null ו-Cascade

  6. 04:48

    הגנה על רשומות מקושרות

  7. 05:57

    טיפול בשגיאת Foreign Key

  8. 07:24

    בדיקת הקשר במחיקה והוספה

תמלול ההרצאה: יצירת קשר יחיד-לרבים ב-SQL

הטקסט המלא של הדקות הראשונות בהרצאה «יצירת קשר יחיד-לרבים ב-SQL» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:02

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

  2. 00:21

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

  3. 00:42

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

  4. 00:52

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

  5. 01:05

    בדיזיין אנחנו הולכים ל-Relationships, הנה האייקון הזה, Relationships ואנחנו יכולים גם איפשהו פה להגיע ל-Relationships, זה לא משנה ואז אנחנו אומרים לו Add בוא תוסיף לנו קשר חדש.

  6. 01:23

    מה שהוא עושה זה נותן לי פה רשימה של טבלאות. הוא אומר לי, תשמע, באיזה טבלאות אתה רוצה לייצר את הקשר? בין איזה טבלאות? יש לי טבלת פריימרי וטבלת פורן.

  7. 01:35

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

  8. 01:47

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

  9. 02:12

    והעמודה היא CTID בטבלת סטודנטס יושבה Foreign Key וזה יהיה CTID שנמצא בטבלת סטודנטס אז אנחנו הגדרנו את הקשר כמו שצריך כאן אנחנו יכולים לתת לו איזשהו שם הוא נותן לנו fk זה foreign key בין students ל-cities אני אשאיר את השם הזה נבצע אוקיי והנה אנחנו רואים כאן student cities בואו נעשה close הכוכבית כאן אומרת שהמידע קיים אבל

  10. 02:38

    הוא לא שמור בואו נבצע save שמר לנו את הנתונים יש כרגע relationship אם אני חוזר כאן ל-relationships אני יכול לראות את ה-relation אני פותח את זה ואני רואה בעצם את ה-relations שיש ביניהם עוד דבר שכדאי לציין זה את האזור הזה insert and update specifications האמת שכשיצרתי את הרגלי שינה היה כדאי לציין את זה אבל בואו נבין רגע מה זה אומר מה שקורה

  11. 03:09

    זה כזה דבר אם בעצם אנחנו באים ואומרים יש לנו תלמידים סבבה יש לנו נניח אלף תלמידים במכללה ותלמיד הוא נמצא בעיר ומוגדר באיזה עיר התלמיד מה מה קורה אם אנחנו באים ואומרים תשמע אני רוצה to delete city לא יודע למה בא לי למחוק עיר מטבלת הערים האם אני יכול למחוק אותה?

  12. 03:30

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

  13. 03:55

    אביב? האם אני רוצה שהוא ימחוק אותם? זה לא כזה הגיוני. האם אני רוצה שהוא ילך ובמקום המספר ה-ID של תל אביב, נניח הוא היה אחד, שהוא יכניס נאל, נאל, נאל, נאל, נאל, נאל בכולם?

  14. 04:05

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

  15. 04:23

    No Action, אל תאשר לעשות את זה. קסקייד, תמחק את אותם תלמידים שגרים בתל אביב. אוי ואבוי, אנחנו לא רוצים לעשות את זה במקרה הזה.

  16. 04:32

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

  17. 04:47

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

  18. 04:54

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

  19. 05:05

    אין תלמידים מהעיר הזאת וכמובן הוא ייתן לעשות את זה. יש לנו גם אפשרות update, אבל בדרך כלל ה-update הוא אותו הדבר כמו ה-delete. ה-update זה אומר מה יקרה אם אני פתאום יחליט לעדכן את המפתח הראשי בטבלת הערים.

  20. 05:18

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

  21. 05:30

    בדרך כלל update הוא אותו דבר כמו delete, אבל זה היה חשוב לציין. השני החבר'ה האלה, אנחנו כמובן נתייחס אליהם כשנבנה עוד קשרים. אז זאת הייתה שיטה ראשונה לייצר את הקשר.

  22. 05:40

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

  23. 05:53

    אני לוחץ enter, בום, שגיאה. ומה שהוא כותב לי פה זה, תראו, העדכון שעשית, יש לו קונפליקט עם איזשהו Foreign Key שזה השם שלו, בדיוק כמו שהגדרנו והוא יתבצע בדאטאבייס קולג' בטבלת הערים ctid, מסביר לנו, תשמע אתה לא יכול לעשות דבר כזה, נעשה אוקיי ונראה שהדאטאבייס

  24. 06:14

    לא מאשר לבצע דבר כזה, בואו נגדיר פה אחד. בואו נבצע משהו אחר, בואו ננסה להוסיף גם את מרג' סימפסון, מרג' את gmail והיא נמצאת בעיר 13, לא עדכנתי, הוספתי, בום, אין שום אפשרות, בוא תגדיר לי עיר נורמלית.

  25. 06:35

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

  26. 06:46

    מה בעצם קרה כאן? המערכת יצרה את מפתח ארבע עבור מארג', ניסתה להכניס אותו, אבל הייתה שגיאה פה עיר, ואז כשתיקנו הוא כבר דילג ויצר אחד חדש, חמש הוא כאילו עשה דילוג, אין מה לעשות בנוגע לזה, זה לא משהו שאמור להפריע לנו, אל תתעסקו עם זה, אני מקבל הרבה פעמים שאלות מתלמידים, איך אני יכול לצמצם את החורים

  27. 07:08

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

  28. 07:21

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

  29. 07:35

    אם אני אנסה למחוק את זה ברור שהוא ייתן לי כי מה הבעיה למחוק תלמיד לא יקרה שום דבר לערים בואו ננסה הלכתי ועשיתי delete הוא אומר לי אתה בטוח אני אומר לו כן חאק בום הכל בסדר אבל אם אני אלך לטבלת ה-cities וינסה למחוק עיר שיש בה תלמידים. בואו ננסה למחוק את העיר אחד.

  30. 07:57

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

לקורס המלא: קורס SQL ו‑DBA אפליקטיבי

ההרצאה הקודמת: יצירת טבלת רשימה ב-SQL

ההרצאה הבאה: יצירת טבלת פירוט - Cascade Delete SQL

הרצאות קשורות מקורסים אחרים

  • אנשי קשר בטלפון
  • LINQ ל- SQL
  • התקנה של SQL
  • בניית אתר אינטרנט אמיתי לחנות חיות - דף צור קשר

קורסים נוספים במסלול

  • קורס NoSQL - MongoDB
  • קורס SSIS
  • קורס BI - ניתוח מסדי נתונים - Qlik Sense
  • קורס Power BI