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

17/11/2010

אין תגובות

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

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).

הוסף תגובה
facebook linkedin twitter email

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *