Monday, May 09, 2011

ההבדל בין Unique Index ו-Unique Constraint

בפורום בסיסי נתונים בתפוז נשאלה שאלה כיצד להגדיר עמודה שאינה מפתח כ-Unique (כלומר- ללא ערכים כפולים). 
עניתי- "בעזרת "Unique Index. זמן קצר לאחר מכן עדי הוסיף שאפשר להשתמש גם ב-Unique Constraint, ויש לי הרגשה שהוא ציין זאת לא בתור "גם לי יש מה לומר" אלא כי יש בהצעתו יתרון מסויים. 
כדי לעמוד על ההבדלים בין שתי ההצעות (לא הרבה..), נתחיל מהדומה, וניצור לשם כך טבלה עם שתי עמודות זהות שלאחת נגדיר אינדקס ולשניה אילוץ:
If Object_Id('Try001','U') Is Not Null Drop Table Try001;
Go
Create Table Try001(ID Int Identity,
                    I1 Int Null,
                    I2 Int Null);
Go
Alter Table Try001 Add Constraint Try001_I1_Constraint Unique Nonclustered(I1)
Create Unique Index Try001_I2_Index ON Try001(I2);
Go
With T As
(Select 1 N
Union All
Select  N+1 N
From    T
Where   N<100)
Insert
Into    Try001
Select  N,
        N
From    T;
Go
מתברר שהמערכת יצרה לאילוץ אינדקס מתאים, זהה לאינדקס שנוצר באופן ישיר (ובנוסף מציגה את האינדקס שנוצר ולא את האילוץ) וזה די הגיוני: לא סביר לצפות שבכל פעם שמכניסים או משנים ערך בעמודה - המערכת תבצע Scan על כל הטבלה כדי לבדוק שהחדש אינו קיים, ואינדקס הוא כלי עזר מתבקש במקרה זה.
ננסה להכניס ערכי Null לעמודות:
Insert
Into Try001
Values(Null,0);
Go
Insert
Into Try001
Values(0,Null);
Go
ה-Nulls נכנסו ללא בעיות שכן שתי העמודות הוגדרו כ-Nullable.
מה יקרה אם ננסה לבצע שליפות מפולטרות או ממויינות של העמודות?
Select I1 From Try001 Where I1=1;
Select I2 From Try001 Where I2=1;
Read more: גרי רשף