PracticU

Delete & Truncate

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

Delete & Truncate
ההרצאה מסבירה את פקודת DELETE ב-SQL: מחיקה של כל השורות, מחיקה לפי תנאי, תיעוד מחיקות ביומן ושימוש ב-EXISTS. בסוף מוסבר ההבדל בין DELETE ל-TRUNCATE.
DELETE
1. טרנזקציה: הבדיקות מתחילות ב-BEGIN TRANSACTION, כדי שאפשר יהיה לבטל את השינויים עם ROLLBACK. ההרצאה משתמשת בזה כדי להדגים מחיקה בלי לשמור אותה.
2. מחיקת כל השורות: DELETE בלי תנאי מוחק את כל השורות בטבלה. לפני המחיקה ואחריה נספרו השורות בטבלת Order Details, שהיו בה 2,145 שורות.
3. מחיקה לפי תנאי: WHERE מגביל את המחיקה. בדוגמה נמחקו שורות של הזמנות לקוח מסוים, באמצעות תת-שאילתה ברשימת מזהי ההזמנות (IN).
4. EXISTS: אותה מחיקה אפשר לכתוב עם EXISTS, שמחזיר אמת אם לפחות שורה אחת מתאימה. בתוך השאילתה מתבצעת השוואה בין עמודת ההזמנה בטבלה החיצונית לטבלה הפנימית. ההרצאה ממליצה לבדוק את השאילתה הפנימית בעזרת SELECT לפני המחיקה.
5. תיעוד מחיקה: OUTPUT deleted.* מחזיר את השורות שנמחקו. אפשר לכתוב אותן לטבלת לוג עם עמודת פעולה (למשל Deleted), ולהחזיר אותן גם לתוכנה שמריצה את הפקודה.
TRUNCATE
6. הבדלים: TRUNCATE מוחק את כל הטבלה בלבד, בלי WHERE. הוא שייך לפקודות DDL ולא DML, ולא מפעיל טריגרים. הוא אינו מתעד כל שורה בנפרד, ולכן הוא מהיר יותר. הוא מאפס את מונה ה-Identity לערך ההתחלתי, דבר ש-DELETE אינו עושה.
7. טרנזקציה: גם TRUNCATE מבוטל בטרנזקציה כמו כל פקודה אחרת.
8. מגבלה: לא ניתן להשתמש ב-TRUNCATE על טבלה שמוצבע אליה ממפתח זר בטבלה אחרת.
9. שחזור: מחיקה שמתועדת ביומן ניתנת לשחזור בכלים חיצוניים שקוראים את הלוג. ב-TRUNCATE אין רישום שורה לשורה, ולכן שחזור דורש גיבוי מלא.
DELETE מתאים למחיקה מדויקת ומתועדת, ו-TRUNCATE מתאים למחיקה מהירה של כל הטבלה.
השיעור הבא בקורס: פקודת Update למתקדמים

פרקי ההרצאה: Delete & Truncate

  1. 00:00

    מבוא: פקודת DELETE ו-TRUNCATE

  2. 00:57

    מחיקת כל השורות בתוך טרנזקציה

  3. 02:33

    ספירת השורות בטבלה לפני המחיקה

  4. 04:07

    מחיקת שורות מסוימות לפי לקוח

  5. 05:51

    תת-שאילתה לבחירת ההזמנות למחיקה

  6. 07:53

    מחיקה עם EXISTS

  7. 09:36

    בדיקת שייכות השורה להזמנת הלקוח

  8. 12:47

    גיבוי השורות שנמחקו עם OUTPUT

תמלול ההרצאה: Delete & Truncate

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

  1. 00:03

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

  2. 00:28

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

  3. 00:41

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

  4. 00:57

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

  5. 01:27

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

  6. 01:56

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

  7. 02:17

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

  8. 02:51

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

  9. 03:05

    אני יכול לכתוב delete, from, אני לא חייב לכתוב from, אני יכול לא לכתוב from, כל אחד איך שהוא אוהב, וזה ימחוק לי את כל השורות.

  10. 03:15

    אני יכול לעשות where ולתת לו איזשהו תנאי. בואו נראה איך זה מוחק לי את כל השורות. אנחנו עושים begin transaction, לא לשכוח לעשות טרנזקציה בהתחלה. עכשיו, למחוק את כל השורות, לראות כמה שורות יש לי.

  11. 03:34

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

  12. 03:51

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

  13. 04:16

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

  14. 04:33

    אז אני עושה, תמחק לי את השורות מ-order details where order ID, order ID in ובסוגריים אני אומר לו, תקשיב, הרשימה של הזמנות תבחר את כל ההזמנות From טבלת orders, where customer ID, יש לי איזשהו לקוח שמה, אני לא זוכר איזה לקוחות יש לי שמה, נעשה פה.

  15. 05:10

    ואפשר לקחת את ה-ynet הזה, אפשר לקחת מישהו אחר, זה לא משנה, בואו ניקח עכשיו לקוח אחר, לקוח 20249. את הלקוח הזה, תום SP. את כל ההזמנות של הלקוח הזה, בואו נראה כמה הזמנות יש ללקוח הזה.

  16. 05:33

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

  17. 06:10

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

  18. 06:39

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

  19. 07:21

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

  20. 07:57

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

  21. 08:23

    כן, ככה, איך אנחנו עושים את זה? אני לוחץ ctrl r, מעיף את הזה. אני פה מתחיל ב-select של order details. את זה אני אשים בהערה שלא בטעות אני אלחץ F5 וזה יימחק לי.

  22. 08:43

    Select from order details, נעשה את זה כוכבית, from order details. where order ID, אנחנו לא רוצים order ID, אנחנו רוצים where it exists, איפה שקיימת לפחות שורה אחת.

  23. 09:05

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

  24. 09:23

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

  25. 09:36

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

  26. 10:05

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

  27. 10:42

    האם יש לקוח בשם כזה, ואם כן כל התנאים התמלאו זה אומר שזה באמת ההזמנה שלו. בואו נראה איך זה עובד ואת זה אנחנו נעיף ונבדוק שזה עובד, ואכן אנחנו קיבלנו 14 שורות מתוך טבלת ה-Order Details עבור הלקוח הזה.

  28. 11:14

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

  29. 11:54

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

  30. 12:31

    כל הרשומות חזרו לנו מצוין אבל המטרה שלנו זה לראות איך עובדים עם אקזיסט אז ראינו אם אקזיסט יופי עכשיו אנחנו רוצים לעשות גיבוי לטבלת order details כמו שעשינו לפני כן לעשות לוג אבל בואו נעשה את זה ככה פה נעשה פשוט פקודת output ונדפיס לדוגמה deleted order id deleted.orderid.deleted.productid איזה אורדר

  31. 13:23

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

  32. 14:01

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

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

ההרצאה הקודמת: כתיבת SCRIPT ב-SQL

ההרצאה הבאה: פקודת Update למתקדמים

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

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