PracticU

check constraint

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

check constraint
בשיעור לומדים על אילוצי CHECK ב-SQL Server: כללים שנשמרים על עמודות של טבלה, ודוחים כל הכנסה או עדכון שלא עומדים בהם.
השלבים העיקריים
1. הבעיה: בטבלת פרטי הזמנה העמודה Quantity מקבלת מספרים שליליים, אבל כמות שלילית לא הגיונית. רוצים לחסום אותה בשכבת בסיס הנתונים.
2. העתקת טבלה לדוגמה: כדי לא לשבש את הטבלה המקורית, מעתיקים אותה עם SELECT ... INTO לטבלה חדשה.
3. הוספת האילוץ דרך העיצוב: בעורך הטבלה מוסיפים Check Constraint, נותנים לו שם, למשל Quantity positive, וכותבים את הביטוי Quantity > 0.
4. בדיקה על המידע הקיים: פעולת ההוספה בודקת גם את השורות שכבר נמצאות בטבלה, כך שטבלה עם נתונים לא תקינים לא תתקבל.
5. סקריפט: Generate Change Script מציג את הפקודה ALTER TABLE ... ADD CONSTRAINT ... CHECK, וכך אפשר ללמוד את הפקודה ולשמור אותה.
6. ניסיון: ניסיון להכניס -2 נדחה עם שגיאה על ההפרה של האילוץ.
7. אילוץ בין שתי עמודות: בטבלת שיבוץ לקורס יש שתי עמודות, סטודנט מחו"ל וסטודנט מקומי. האילוץ StudentUSA IS NOT NULL OR StudentLocal IS NOT NULL דורש שלפחות אחת מהן תהיה מלאה, ואסור ששתיהן יהיו ריקות.
פקודות והגדרות
- ALTER TABLE OrderDetails2 ADD CONSTRAINT Quantity_positive CHECK (Quantity > 0)
- ALTER TABLE Enrollments ADD CONSTRAINT Student_one_required CHECK (StudentUSA IS NOT NULL OR StudentLocal IS NOT NULL)
טעויות נפוצות
- אחרי שמוסיפים את האילוץ בין שתי העמודות, שורה שבה שתיהן ריקות נדחית, ואילו שורה עם ערך באחת מהן מתקבלת. כדאי לבדוק את שני המקרים אחרי כל שינוי.
- אילוץ שנכשל על נתונים קיימים לא ייווצר, ולכן צריך לתקן את הנתונים לפני ההוספה.
שימו לב
CHECK constraint הוא הדרך הנכונה לחסום נתונים שגויים בתוך בסיס הנתונים, ולא רק באפליקציה. כך גם תוכנה שנכתבה בעתיד לא תוכל לשמור ערך לא תקין.
השיעור הבא בקורס: יצירת טריגר Trigger for / after

פרקי ההרצאה: check constraint

  1. 00:00

    מגבלת CHECK: מניעת כמות שלילית

  2. 00:38

    העתקת הטבלה לדוגמה

  3. 02:46

    הוספת CHECK Constraint לטבלה

  4. 04:04

    יצירת סקריפט השינוי עם Generate Change Script

  5. 05:03

    בדיקה: ניסיון להכניס ערך שלילי

  6. 05:38

    דאטאבייס חדש: טבלת שיבוצים

  7. 06:33

    טבלת השיבוצים: סטודנט אחד מכל סוג

  8. 07:38

    אילוץ: בדיוק אחד מהשדות מלא

תמלול ההרצאה: check constraint

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

  1. 00:02

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

  2. 00:17

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

  3. 00:29

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

  4. 01:00

    ויש לנו טבלת order details 2 עכשיו אנחנו יכולים לעשות Select from order details 2 ולקבל את כל הטבלה שזה מצוין, דרך אגב זה אדום כי הוא עוד לא מכיר שהאובייקט הזה כבר קיים זאת אומרת אם אני אסגור אותו לגמרי, אפתח פה לעשות רפרש, פה אני אעשה רפרש והנה הוא קיים, אני עושה New Query, הוא כבר מכיר אותו.

  5. 01:27

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

  6. 01:50

    אתם רואים, הוא לא רואה אותו. לא נורא, אנחנו לא מתבאסים מזה. order details 2 dbo זה user שיצר אותו אוקיי למעשה השם המלא של הטבלה זה שם של database נקודה שם של user נקודה שם של user נקודה זה נקרא זה השם המלא שם של הדאטאבייס נקודה שם של user שיצר אותו שזה dbo database owner שם של טבלה זה השם המלא של טבלה אם אנחנו באים לפה ושמים

  7. 02:32

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

  8. 02:51

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

  9. 03:01

    אנחנו באים ל-order details, עושים design לטבלה ומוסיפים constraint, זה נקרא check constraint, מוסיפים אותו. מוסיפים צ'ק קונסטריינט פה לרשימה ניתן לה שם קוואנטיטי פוזיטיב פוזיטיב ופה אנחנו כותבים את הביטוי מהו הביטוי שאנחנו רוצים איזה ביטוי אנחנו רוצים שהקוואנטיטי שעמודת הקוואנטיטי תהיה גדולה מאפס נניח

  10. 03:39

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

  11. 04:00

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

  12. 04:19

    יופי, בואו נראה, נעשה לזה סייב לפני הסייב. אני רוצה להראות לכם את הסקריפט שהוא יוצר. Generate Change Script. אנחנו יכולים ככה ללמוד פקודות ואנחנו רואים פה את הפקודה alter table תשנה טבלה שם של טבלה add constraint תוסיף constraint שם של constraint מסוג check זה אומר בדיקה ומה לבדוק אוקיי יפה מאוד אז זה יכלנו להריץ את זה אם היינו רוצים לכתוב סקריפט שמייצר לנו הכל אנחנו לא רוצים אנחנו עושים save ברגע

  13. 04:56

    שעשינו פה save אפשר כבר לסגור את זה אנחנו רואים פה בקונסטרנט שהתבסף לנו הקונסטרנט החדש נעשה edit נבוא להכניס מינוס שתיים, הוא לא נותן לי. הוא כותב לי ש-e-quantity positive, check constraint לא נותן להכניס מידע שגוי.

  14. 05:17

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

  15. 05:31

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

  16. 06:03

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

  17. 06:29

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

  18. 06:40

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

  19. 06:53

    אבל אתה יכול להיות או סטודנט USA או סטודנט לוקל. או שאתה פה או שאתה פה. אבל מה אסור? אסור ששניהם יונעל. אסור ששניהם יונעל.

  20. 07:04

    בואו תראו Students Courses, תראו מה אסור. יכול להיות שנניח שיבוץ מספר 1 זה תלמיד עם תעודת זהות 100, תלמיד 100 משובץ לקורס מספר 17. שיבוץ שני, תלמיד מקומי שהמספר שלו 54 גם הוא משובץ לקורס מספר 17. אוקיי?

  21. 07:38

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

  22. 07:56

    לא בשניהם ביחד. איך אני עושה את הדבר הזה? לדוגמה, איך אני עוקף את הלוגיקה הזאת? אז אני משתמש ב-check constraint ומוסיף פה מגבלה. מוסיף פה מגבלה שאני אומר לה, השם שלה שיהיה stent constraint אבל מה החוק

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

ההרצאה הקודמת: Unique

ההרצאה הבאה: יצירת טריגר Trigger for / after

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

  • PING CHECK
  • Swarm - Label Constraint
  • הסבר על Cluster - צ'ק פוינט - Check Point

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

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