上次說了同一個對象裡面不同觸發器的執行順序。今天我也想分享一些我在同一個表裡面,建上不同的唯一約束,不同的唯一索引,看下結果會怎樣 首先簡單建個測試表,不多,就4列 CREATE TABLE AAA3 (ID INT IDENTITY(1,1),Col1 VARCHAR(50),Col2 VARCH
上次說了同一個對象裡面不同觸發器的執行順序。今天我也想分享一些我在同一個表裡面,建上不同的唯一約束,不同的唯一索引,看下結果會怎樣
首先簡單建個測試表,不多,就4列
CREATE TABLE AAA3 (ID INT IDENTITY(1,1),Col1 VARCHAR(50),Col2 VARCHAR(50),Col3 VARCHAR(50))
情況1:然後往Col1 都添加上唯一索引和唯一約束。然後插入同樣的數據,看下提示信息報那個先
CREATE UNIQUE INDEX UQ_AAA3_Col1 ON AAA3(Col1) ALTER TABLE dbo.AAA3 ADD CONSTRAINT UQ_AAA3_Col1_1 UNIQUE(Col1) INSERT INTO dbo.AAA3 ( Col1, Col2, Col3 ) VALUES ( N'1', N'',N'' ) GO 2 開始執行迴圈 (1 行受影響) 消息 2601,級別 14,狀態 1,第 9 行 不能在具有唯一索引“UQ_AAA3_Col1”的對象“dbo.AAA3”中插入重覆鍵的行。重覆鍵值為 (1)。 語句已終止。 ** 在執行批處理期間遇到錯誤。正在繼續。 批處理執行已完成 2 次。
出錯是肯定的,但是可以看到,出錯信息是顯示唯一索引 UQ_AAA3_Col1 而並非唯一約束創建的索引 UQ_AAA3_Col1_1 。這裡大概可以知道是在同一個欄位裡面比較,唯一索引比唯一約束要優先。(當然誰那麼無聊……)
情況2:然後我嘗試了一下在不同的列上面建唯一約束和唯一索引,看下是哪個比較優先,用在本例子,就是 Col2 創建唯一約束, Col3 創建唯一索引
ALTER TABLE dbo.AAA3 ADD CONSTRAINT UQ_AAA3_Col2_1 UNIQUE(Col2) CREATE UNIQUE INDEX UQ_AAA3_Col3 ON AAA3(Col3) INSERT INTO dbo.AAA3 ( Col1, Col2, Col3 ) VALUES ( N'2', N'',N'' ) 消息 2627,級別 14,狀態 1,第 9 行 違反了 UNIQUE KEY 約束“UQ_AAA3_Col2_1”。不能在對象“dbo.AAA3”中插入重覆鍵。重覆鍵值為 ()。
確實報唯一索引的拋出出的錯。(我懷疑過,是因為Column_id 前後的關係嗎?然而不是,即使我在Col2 建唯一索引,Col3 建唯一約束,結果也是一樣。唯一約束的判定優先)。
情況3 :將情況2 的約束索引+情況1 的唯一索引都幹掉,新增一個組合唯一索引查看效果。把Col1,Col2 組成組合唯一約束,看下效果是哪個好
ALTER TABLE dbo.AAA3 ADD CONSTRAINT UQ_AAA3_Col1_2 UNIQUE(Col1,Col2) INSERT INTO dbo.AAA3 ( Col1, Col2, Col3 ) VALUES ( N'1', N'',N'' ) 消息 2627,級別 14,狀態 1,第 9 行 違反了 UNIQUE KEY 約束“UQ_AAA3_Col1_2”。不能在對象“dbo.AAA3”中插入重覆鍵。重覆鍵值為 (1, )。
這個例子看出,符合唯一約束優先檢測~so,我想到的情況就是這個樣紙了~
PS:有時覺得研究這些問題可能是沒有什麼實際應用場景~但是還是需要腦洞一下了~聊此一笑呵呵