
BEGIN TRANSACTION, כדי שאפשר יהיה לבטל את השינויים עם ROLLBACK. ההרצאה משתמשת בזה כדי להדגים מחיקה בלי לשמור אותה.DELETE בלי תנאי מוחק את כל השורות בטבלה. לפני המחיקה ואחריה נספרו השורות בטבלת Order Details, שהיו בה 2,145 שורות.WHERE מגביל את המחיקה. בדוגמה נמחקו שורות של הזמנות לקוח מסוים, באמצעות תת-שאילתה ברשימת מזהי ההזמנות (IN).OUTPUT deleted.* מחזיר את השורות שנמחקו. אפשר לכתוב אותן לטבלת לוג עם עמודת פעולה (למשל Deleted), ולהחזיר אותן גם לתוכנה שמריצה את הפקודה.הטקסט המלא של הדקות הראשונות בהרצאה «Delete & Truncate» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
שלום לכולם, בהרצאה הזאת אנחנו נלמד על פקודת delete, נראה איך מוחקים את כל השורות, נראה איך מוחקים שורות ספציפיות, נראה איך מתעדים את זה בקובץ גיבויים, בקובץ היסטוריה, בקובץ לוג, נראה איך אנחנו משתמשים בפקודה exists, שזה לפי התקן, ודי פופולרי שמשתמשים
בפקודה הזאת, למרות שאני לא כזה אוהב אותה, ונראה מה ההבדל בין delete לטרנקייט, וזאת שאלה מאוד ידועה בראיונות עבודה, אוקיי?
בהרבה ראיונות עבודה שואלים מה זה הטרנקייט ומה ההבדל בינו לבין delete רגיל, אז אני רוצה שנדבר על זה במפורש ונראה גם דוגמה. טוב, בואו נתחיל.
איך מוחקים את כל השורות בטבלה? אני לא באמת רוצה למחוק אותם, אז אני עושה טרנזקציה, טרנזקצ'ן, בגין טרנזקצ'ן, לרוב כותבים פשוט טרנס וזה מספיק אבל אני אכתוב טרנזקשן אפשר גם לכתוב בגין טראן שזה אותו דבר ואנחנו מתחילים טרנזקציה שכדי שאחרי שאני עושה את כל
השינויים אני אוכל לעשות פקודת rollback ולבטל את כל השינויים הרצאה על מה זה טרנזקציות ואיך בדיוק עובדים איתם תהיה לנו הרצאה נפרדת בגדול זה כמה פעולות שאני מבצע כיחידה אחת ואני יכול לגלגל את כולם ביחד חזרה או שאני יכול להפוך, לבצע אותם ולקבע אותם קבוע במערכת על ידי קומיט.
המטרה של הטרנזקציה כדי שלא יבצר מצב שמחשבון בנק אחד משכנו כסף ולחשבון אחר לא הפקדנו כסף כי בדיוק נפל החשמל לדוגמה, או קרתה איזושהי תקלה, כדי שכמה פעולות שונות יתבצעו כיחידה לוגית אחת.
אני מנצל את הטרנזקציה כדי למחוק שורות, להראות לכם שמחקתי ואחרי זה לבטל את המחיקה ככה אני מנצל אותה טוב אנחנו רוצים עכשיו למחוק הזמנות של איזשהו לקוח מטבלת אורדר דיטלס אז נעשה פה סלקט קאונט כוכבית נספור כמה שורות יש פרום אורדר דיטלס כמה שורות יש לנו בטבלת אורדר דיטלס ואנחנו רואים שיש לנו 2145 שורות
כרגע אני רוצה למחוק אותם וזאת פקודת delete delete ואני אומר מאיזה טבלה אני רוצה למחוק את השורות. בואו נתחיל מזה שנמחק את כל השורות.
אני יכול לכתוב delete, from, אני לא חייב לכתוב from, אני יכול לא לכתוב from, כל אחד איך שהוא אוהב, וזה ימחוק לי את כל השורות.
אני יכול לעשות where ולתת לו איזשהו תנאי. בואו נראה איך זה מוחק לי את כל השורות. אנחנו עושים begin transaction, לא לשכוח לעשות טרנזקציה בהתחלה. עכשיו, למחוק את כל השורות, לראות כמה שורות יש לי.
יש לי 0 שורות ולגלגל טרנזקציה חזרה. גלגלתי אותה חזרה ועכשיו יש לי עוד פעם 2,145 שורות. בואו נעשה את זה עכשיו ביחד, הכל כמכה אחת.
אנחנו רואים שהיה לנו 2,145 שורות, נהיה לנו 0 שורות ואחרי הרולבק נהיה לנו עוד פעם 2,145 שורות. ראינו איזה יופי, המטרה הייתה להראות לכם פקודת delete, אבל על הדרך גם למדנו מה זה טרנזקציה.
אוקיי, אז אנחנו רואים פה שזה כן נמחק. עכשיו אני רוצה למחוק רק שורות מסוימות, רק שורות של הזמנה של איזשהו לקוח. נניח יש לי איזשהו לקוח ואני רוצה למחוק את השורות שלו.
אז אני עושה, תמחק לי את השורות מ-order details where order ID, order ID in ובסוגריים אני אומר לו, תקשיב, הרשימה של הזמנות תבחר את כל ההזמנות From טבלת orders, where customer ID, יש לי איזשהו לקוח שמה, אני לא זוכר איזה לקוחות יש לי שמה, נעשה פה.
ואפשר לקחת את ה-ynet הזה, אפשר לקחת מישהו אחר, זה לא משנה, בואו ניקח עכשיו לקוח אחר, לקוח 20249. את הלקוח הזה, תום SP. את כל ההזמנות של הלקוח הזה, בואו נראה כמה הזמנות יש ללקוח הזה.
ללקוח הזה יש 6 הזמנות, מצוין הנה זה כל השש ההזמנות שלו אז אנחנו בעצם אומרים לו delete מטבלה מסוימת רק שורות שמקיימות את התנאי הזה עבור כל שורה הוא יבדוק האם היא מקיימת את התנאי ומהו התנאי שבשורה הספציפית העמודת orderid תהיה בתוך הרשימה הזאת למעשה אני בודק האם עבור כל הזמנה אם היא ברשימה של אלו
שצריכים למחוק אותם זה נקרא תת שאילתא וככה אני הכי הרבה אוהב לכתוב כי זה נורא נוח לי לבדוק את זה, לראות ואז להגיד לו אל תראה לי את כל העמודות תראה לי רק את העמודות הספציפיות וזהו ואז הוא מראה לי רק את העמודות האלו רק את ה-orders ID האלו ועבור כל שורה נבדוק האם היא נמצאת פה ברשימה בוא נריץ את
כל זה ביחד ונראה היה לנו 2,145 שורות מחקנו נהיה לנו 2,131 שורות ואחרי זה עשינו rollback ונהיה לנו 2,145 בחזרה זאת אומרת שאם אני אעשה את כל הטרנזקציה הזאת עוד פעם עד לכאן לפני הרולבק ואני אסתכל על הזמנות ועכשיו נעשה פה סלקט כוכבית פרום אורדר דיטלס
אנחנו נראה שאין לנו כרגע הזמנה 10249 היא לא קיימת עד שאני לא אעשה רולבק ברגע שאני עושה רולבק החזרתי הכל חזרה ועכשיו הזמנה 10249 חזרה חזרה יפה מאוד יפה מאוד אז יופי אז ראינו איך עובד delete עם where על הדרך גם התחלנו לראות מה זה טרנזקציות אבל האמת על טרנזקציות
יש סרט נפרד שזה סיפור שלם שם וזה נושא מאוד חשוב ומאוד גדול אני לא נכנס לפרטים שלו כי זה לא הנושא של ההרצאה הלאה אם יכולתי גם לכתוב את זה בצורה אחרת בצורה הסטנדרטית של האקזיסט שאני פחות אוהב אותה אבל בואו נעשה את זה.
כן, ככה, איך אנחנו עושים את זה? אני לוחץ ctrl r, מעיף את הזה. אני פה מתחיל ב-select של order details. את זה אני אשים בהערה שלא בטעות אני אלחץ F5 וזה יימחק לי.
Select from order details, נעשה את זה כוכבית, from order details. where order ID, אנחנו לא רוצים order ID, אנחנו רוצים where it exists, איפה שקיימת לפחות שורה אחת.
ומה יש לנו בשורה הזאת? מה יש לנו בשורה הזאת? אנחנו בוחרים מטבלת ה-Orders כל השורות, איפה שהלקוח שווה ללקוח הזה, זה למעשה די אותו דבר, זו אותה שאילתא.
לא אכפת לנו איזה עמודות הוא יחזיר, כי אקזיסט מחזיר true אם יש לפחות שורה אחת בכל התוצאה. וגם אם אני לא אעשה עכשיו וגם זה תמיד יהיה אמת, תמיד הוא יחזיר לי שורות.
אני צריך לבדוק שהשורה אכן שייכת להזמנה של הלקוח הזה, זאת אומרת באורדר דיטלס נקודה אורדר איידי שווה לטבלת אורדרס אורדרס נקודה אורדר איידי.
עכשיו שימו לב האורדר דיטלס הזה הוא לא נמצא כאן בסלקט האורדר דיטלס הזה לא נמצא בסלקט בגלל זה הסלקט הזה לא יעבוד לי הוא לא יודע מי זה אורדר דיטלס איפה האורדר דיטלס הזה הוא מהשאילתה למעלה ולמעשה הערך שלה של הדבר הזה הוא מגיע מהבחוץ שלו מהבחוץ שלו ולכן הוא נבדק עבור כל שורה בנפרד ונבדק האם השורה ספציפית כרגע בתוך ה-Order Details, אליהם מחברים את אותה שורה מ-Orders ובודקים
האם יש לקוח בשם כזה, ואם כן כל התנאים התמלאו זה אומר שזה באמת ההזמנה שלו. בואו נראה איך זה עובד ואת זה אנחנו נעיף ונבדוק שזה עובד, ואכן אנחנו קיבלנו 14 שורות מתוך טבלת ה-Order Details עבור הלקוח הזה.
10249 זה אומר שהצלחנו עכשיו אנחנו רוצים הרי למחוק אז אני שם את זה בהערה ואת זה אני משחרר מהערה ועכשיו יש לי פקודה אחת כזאת ארוכה שמוחקת את השורות כאלו אבל אני לא שוכח לעשות טרנזקציה ואפילו אני אעשה לכם פה סלקט מתוך order details להראות שאין כלום שהוא נעלם ואחרי זה נראה גם שהוא חזר נכון הרולבק הזה מדהים יופי בואו
נראה את כל זה עובד מתחילים טרנזקציה סופרים כמה שורות יש לנו מוחקים את השורה על ידי אקזיסט של לקוח מסוים רואים שבאמת הכל נמחק מגלגלים הכל חזרה אנחנו רואים שהיה לנו 2145 שורות אחרי זה עשינו מחיקה נהיה לנו 2131 שורות אנחנו רואים שבאמת אנחנו רואים שבאמת הזמנה 10249 נעלמה לנו ואנחנו רואים שאחרי rollback היא כן חוזרת לנו
כל הרשומות חזרו לנו מצוין אבל המטרה שלנו זה לראות איך עובדים עם אקזיסט אז ראינו אם אקזיסט יופי עכשיו אנחנו רוצים לעשות גיבוי לטבלת order details כמו שעשינו לפני כן לעשות לוג אבל בואו נעשה את זה ככה פה נעשה פשוט פקודת output ונדפיס לדוגמה deleted order id deleted.orderid.deleted.productid איזה אורדר
איידי איזה מוצר מחקנו וזהו מספיק לי כן עכשיו אם אני אעשה את זה ככה זה יעבוד והוא ידפיס לי את זה על המסך מה הוא מחק ואנחנו נוכל לראות פה שהוא מחק לי את המוצרים האלו אנחנו יכולים לראות פה את המוצרים שהוא מחק את 14 המוצרים שהוא מחק זה פלט לי את זה למסך עכשיו למה זה טוב לפלוט למסך כי לפעמים במקום מסך השאילתות
האלו מי שמבצע אותם זה אתר אינטרנט ואז פלט הזה למעשה חוזר למתכנת של האתר והוא