PracticU

יצירת טבלת פירוט
Cascade Delete SQL

בלי כתוביותעם כתוביות
PracticU › קורס DBA אפליקטיבי - שפת SQL למתחילים › יצירת טבלת פירוט Cascade Delete SQL
מילון מושגים:
DELETE - פקודת SQL למחיקת שורות מטבלה. גם שיטת HTTP לבקשת מחיקה של משאב בשרת.
NoSQL - משפחת מסדי נתונים לא-יחסיים, המתאימים לנתונים גמישים ולהיקפים גדולים, כמו מסמכים או זוגות מפתח-ערך.
MongoDB - מסד נתונים מסוג NoSQL שמאחסן נתונים כמסמכים בפורמט דמוי JSON, בלי מבנה טבלאי קשיח.
JSON - פורמט טקסט קריא לייצוג נתונים מובְנים כזוגות מפתח-ערך, נפוץ להחלפת מידע בין שרת ללקוח.
עמודה - שדה בטבלת מסד נתונים שמחזיק ערך מסוג מסוים עבור כל שורה, למשל שם או תאריך.
מפתח ראשי - עמודה או צירוף עמודות שמזהים באופן ייחודי כל שורה בטבלת מסד נתונים.
מפתח זר - עמודה בטבלה שמפנה למפתח הראשי בטבלה אחרת, ובכך יוצרת קשר בין הטבלאות.
בינארי - ייצוג מידע בבסיס 2 בעזרת הספרות 0 ו-1. גם קובץ הכולל קוד מכונה ולא טקסט קריא.

יצירת טבלת פירוט Cascade Delete SQL
מגיעים לסוג טבלה נוסף: טבלת פירוט (Detailing Table). הרעיון מתברר כשרוצים להוסיף לתלמיד שדה טלפון, ומתגלה שלתלמיד יכולים להיות כמה טלפונים, אפס או יותר.
הדרך לפתרון
1. ניסוח הצורך: מוסיפים לטבלת Students עמודת Phone Number מסוג varchar(20), nullable, כי לא כל טלפון חייב להישמר ולא צריך תווים בעברית או רוסית.
2. למה לא NVARCHAR: varchar תופס בית אחד לכל תו, לעומת nvarchar שתופס שני בתים, ולכן חוסך זיכרון כשאין צורך בתווים לא-לטיניים.
3. הבעיה מתגלה: לליסה יש שני טלפונים. אי אפשר לשים שניים בתא אחד מופרדים בפסיק, כי במסד נתונים רלציוני כל תא מחזיק נתון בודד, לא מערך. ב-NoSQL (כמו MongoDB) אפשר להחזיק מערך בתוך JSON, אבל לא בטבלה רלציונית.
4. פתרון כושל: להוסיף עמודות Main Phone Number ו-Secondary Phone Number יוצר מורכבות, בזבוז מקום לרוב התלמידים שיש להם טלפון אחד, ובעיה אם תלמיד מגיע עם חמישה טלפונים ואין מקום.
5. הפתרון הנכון: טבלה נפרדת Phones, עם PhoneID כמפתח ראשי (int, identity), עמודת PhoneNumber (varchar(20), חובה), ועמודת StudentID כמפתח זר (int, לא NULL, כי טלפון חייב להשתייך לתלמיד).
6. הגדרת הקשר: בדיאגרם מותחים קו Relation בין StudentID בטבלת Students לבין StudentID בטבלת Phones.
7. כלל Cascade: בטבלת פירוט תמיד בוחרים Cascade על Delete, כך שמחיקת תלמיד תמחק אוטומטית גם את הטלפונים שלו בטבלה האחרת, כי אלה נתונים שתלויים בו לחלוטין.
פקודות והגדרות
- varchar(20) לעמודת טלפון.
- אפשרות Tools > Options > Prevent Saving Changes That Require Table Recreation - כיבוייה מאפשר לבצע שינוי מבנה שדורש יצירה מחדש של הטבלה (למשל תיקון טעות בסוג העמודה).
טעויות נפוצות
- טעות בהגדרת סוג העמודה כ-binary במקום varchar גורמת לשגיאה בהוספת מספר טלפון עם מקפים. נדרש תיקון בדיזיין ואישור יצירה מחדש של הטבלה.
- הוספת מקפים בתוך מספר טלפון אינה מקובלת.
- הכנסת טלפון לתלמיד שלא קיים (StudentID לא תקין) נכשלת בגלל קשר ה-Relation.
כעת ברור מתי להשתמש בטבלת פירוט, ונבדק בפועל שמחיקת תלמיד עם Cascade מוחקת גם את הטלפונים שלו.
השיעור הבא בקורס: יצירת טבלת קשר רבים-לרבים ב-SQL

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

  1. 00:00

    הוספת טלפון לתלמיד

  2. 00:41

    בחירת טיפוס varchar לטלפון

  3. 02:30

    הבעיה של טלפונים מרובים

  4. 03:05

    ערך בודד בכל תא

  5. 04:17

    עמודות טלפון נפרדות

  6. 05:49

    טבלת פירוט נפרדת לטלפונים

  7. 07:03

    בניית טבלת הטלפונים

  8. 09:17

    הגדרת Cascade Delete

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

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

  1. 00:02

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

  2. 00:13

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

  3. 00:23

    ומה שאני רואה שיש לי בתלמיד זה קוד חשוב, first name, last name, email, ctid, באיזה עיר הוא גר. ואני רוצה להוסיף גם טלפון. הגיוני שיהיה לי טלפונים של תלמידים.

  4. 00:36

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

  5. 00:50

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

  6. 01:08

    רק ספרות, אולי גם איזה אות באנגלית, אולי מקף. אין בעיה שזה יהיה ורצ'אר. מיותר שזה יהיה N. ורצ'אר יותר מצומצם בזיכרון מאשר N-וורצ'אר.

  7. 01:19

    ורצ'אר תופס בית אחד לכל תו. N-וורצ'אר תופס שני בתים לכל תו. מן הסתם הוא פי שתיים יותר מצומצם בזיכרון. לכן אגדיר ורצ'אר. לא יודע אם חמישים נראה לי too much, בואו נגדיר עשרים, כמה אנחנו צריכים כבר עבור טלפון ונגיד עלה או נעל.

  8. 01:37

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

  9. 01:55

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

  10. 02:12

    וליסה, נגדיר לה היא 04, גרה בחיפה, 1234567, מעולה. אבל לליסה יש עוד טלפון. הופה, מה אנחנו עושים?

  11. 02:25

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

  12. 02:38

    מה נעשה? נגיד אולי שמותר להכניס 100 תווים? מותר להכניס 200? 1,000 תווים? בשביל להכניס הרבה טלפונים? ואם אני מכניס טלפונים, למה פסיק? אולי רווח?

  13. 02:51

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

  14. 03:09

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

  15. 03:26

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

  16. 03:53

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

  17. 04:17

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

  18. 04:28

    ובנוסף, בואו נגדיר סקונדרי פון נאמבר, או מובייל פון נאמבר, או אופיס פון נאמבר. וכבר אתם רואים שיש לי פה צרות צרורות. כמובן, כולם הגיוני שהם יהיו ורצ'או.

  19. 04:45

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

  20. 04:56

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

  21. 05:07

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

  22. 05:20

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

  23. 05:31

    נלך אחד-אחד ונמחק. delete, תעיף לי את כולם, אני לא רוצה בכלל בכלל שיהיה לי כמה טלפונים ביחד בטבלת התלמידים. מה פותר את הבעיה?

  24. 05:43

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

  25. 06:04

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

  26. 06:27

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

  27. 06:43

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

  28. 06:52

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

  29. 07:10

    מפתח כמובן אמור להיות, מפתח ראשי זה יהיה פון איי-די, נגדיר אינט, נוריד על האונל, נסמן מפתח, נגדיר אידנטיטי yes כאן אני רוצה את הפון נאמבר זה יהיה אותו וורצ'אר בגודל 20 חובה לספק לא הגיוני שיביאו לי טלפון לתלמיד אבל לא יביאו

  30. 07:32

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

  31. 07:50

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

  32. 08:04

    בואו נבצע שמירה, ויש לנו phones, טבלת טלפונים. עכשיו אנחנו יכולים לגשת לטבלת הטלפונים. רגע, בואו נסתכל על התלמידים ונראה שיש לנו student ID גג 3. בואו נלך לטבלת הטלפון.

  33. 08:18

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

  34. 08:50

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

  35. 09:17

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

  36. 09:32

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

  37. 09:45

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

  38. 09:53

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

  39. 10:11

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

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

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

ההרצאה הבאה: יצירת טבלת קשר רבים-לרבים - ב-SQL

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

  • טבלת Temporal
  • בדיקות טבלת החלטה
  • LINQ ל- SQL
  • התקנה של SQL

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

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