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