הבלוג של גרי רשף

16/11/2010

מניעת הזנה כפולה

Filed under: Uncategorized — תגיות: , , — גרי רשף @ 20:31

יש לנו טבלת ניהול, למשל- טבלת סוגי עובדים, ובה עובד ומנהל:

Create Table T_SugeyOvdim(MisparSug Int Primary Key,

                        ShemSug Varchar(50));

Go


Insert Into T_SugeyOvdim

Select 10,'עובד'

Union All

Select 20,'מנהל';

Go

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

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

אפשרות אחת היא למחוק את השורות לפני ההוספה (אם הן קיימות – ימחקו, ואם לא – לא יקרה דבר):

Delete

From T_SugeyOvdim

Where MisparSug In (5,25);

Go


Insert Into T_SugeyOvdim

Select 5,'פרילנסר'

Union All

Select 25,'מנהל בכיר';

Go

ואפשרות אחרת היא להוסיף תנאי שימנע נסיון הוספה שגוי:

Insert Into T_SugeyOvdim

Select *

From (Select 5 MisparSug,'פרילנסר' ShemSug

      Union All

      Select 25 MisparSug,'מנהל בכיר' ShemSug) T

Where MisparSug Not In (Select MisparSug

                        From T_SugeyOvdim);

Go

אך מה נעשה אם לטבלה אין מפתח ראשי- לא במפורש ולא במרומז?

במקרה כזה לא נותר לנו אלא להתייחס לכל העמודות כאל מפתח אחד, ולהוסיף את השורות כך:

Insert Into T_SugeyOvdim

Select 5,'פרילנסר'

Union All

Select 25,'מנהל בכיר'

Except

Select  *

From    T_SugeyOvdim;

Go

פקודת ה-Except מפלטרת את כל השורות שכבר קיימות בטבלה, ומותירה את החדשות.

אפשר כמובן לעשות זאת באמצעות Not Exists או Join תוך שאנחנו משווים באמצעות On בין העמודות המתאימות, אך זו דרך מסורבלת (כשיש הרבה עמודות) וזרועת מוקשים (כשיש ערכי Null).

מודעות פרסומת

2 תגובות »

  1. שלום,

    מדוע באפשרות השניה, בסוף השורה החמישית, מופיעה האות T?

    תגובה של נועה — 23/12/2011 @ 09:22

    • אני מבין שאת שואלת על הדוגמה שלאחר המשפט "ואפשרות אחרת היא להוסיף תנאי שימנע נסיון הוספה שגוי".
      .יש שם שאילתת משנה בתוך סוגריים, וצריך לתת לה שם (Alias Name) כדי שיהיה ניתן לפנות אליה (שוב- לפנות לשאילתת המשנה ולא לטבלה או לטבלאות שיוצרות אותה).
      לא תמיד צריך את השם הזה, אך המערכת מתעקשת שניתן אותו.
      T זה בשביל לצאת ידי חובה, ומי שרוצה יכול לכתוב במקום MySubQuery וכו'..

      תגובה של גרי רשף — 23/12/2011 @ 09:48


RSS feed for comments on this post. TrackBack URI

כתיבת תגובה

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

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s

יצירה של אתר חינמי או בלוג ב־WordPress.com.

%d בלוגרים אהבו את זה: