時間:2015/6/28來源:IT貓撲網(wǎng)作者:網(wǎng)管聯(lián)盟我要評論(0)
今天同學向我提了一個問題,我覺得蠻有意思,現(xiàn)記錄下來大家探討下。問題是:在一個表里面,有一個允許為空的字段,空是可以重復(fù)的,但是不為空的值需要唯一。
表結(jié)構(gòu)如下面代碼創(chuàng)建
以下為引用的內(nèi)容: CREATE TABLE test_tb
( TestId int not null identity(1,1) primary key, Caption nvarchar(100) null ); GO |
解決方案1:
對于這個問題,大家的第一個想法可能是:在Caption這個字段上面加一個唯一鍵不就可以了嗎?好,我們按著這個思路做下去,先創(chuàng)建唯一索引。
以下為引用的內(nèi)容: CREATE UNIQUE NONCLUSTERED INDEX un_test_tb
ON test_tb(Caption) GO |
索引創(chuàng)建好了,我們來測試下效果
以下為引用的內(nèi)容: INSERT INTO test_tb (Caption)
VALUES (null) GO INSERT INTO test_tb (Caption) VALUES (null) GO |
運行之后我們會收到下面的錯誤信息:
以下為引用的內(nèi)容: 消息 2601,級別 14,狀態(tài) 1,第 1 行
不能在具有唯一索引 'un_test_tb' 的對象 'dbo.test_tb' 中插入重復(fù)鍵的行。 語句已終止。 |
所以該解決方案是不行的。
解決方案2:
添加約束,讓sql server在插入數(shù)據(jù)的時候,先驗證下已有數(shù)據(jù)中是否有現(xiàn)在要插入的這個值。由于這個約束不是簡單的一個運算,因此我們先創(chuàng)建一個函數(shù),然后再在約束中調(diào)用這個函數(shù)。
創(chuàng)建驗證邏輯函數(shù):