当前位置: 代码迷 >> Sql Server >> 创建“允许为空,但不为空时不能重复”的约束,该如何解决
  详细解决方案

创建“允许为空,但不为空时不能重复”的约束,该如何解决

热度:14   发布时间:2016-04-27 18:46:30.0
创建“允许为空,但不为空时不能重复”的约束
我有一个字符串(最长18位)的列,要求创建“允许为空,但不为空时不能重复”的约束,不知哪位大侠能否解决,谢谢!

------解决方案--------------------

SQL code
CREATE TABLE [tb3] (    [myid] [char] (10)  ,    [mytext] [char] (10)  )ALTER TABLE [tb3] ADD     CONSTRAINT [wy] UNIQUE  NONCLUSTERED     (        [myid]    ) insert into tb3select null,'adsfad' union allselect 'aaaa','adsfad' union allselect 'bbbb','adsfad' union allselect 'cccc','ccccd'select * from tb3/*myid       mytext     ---------- ---------- NULL       adsfad    aaaa       adsfad    bbbb       adsfad    cccc       ccccd     (所影响的行数为 4 行)*/
------解决方案--------------------
SQL code
CREATE FUNCTION f_check(@a VARCHAR(10))RETURNS BITASBEGIN    DECLARE @bit BIT    SELECT @bit = 0    WHERE (SELECT COUNT(1) FROM tb WHERE a = @a) = 1        OR @a IS NULL         SET @bit = ISNULL(@bit,1)    RETURN @bitENDGOCREATE TABLE tb(a VARCHAR(10)  NULL,CONSTRAINT ck_tb CHECK (dbo.f_check(a) = 0))GOINSERT tb SELECT 'cc' UNION ALL SELECT NULLGOINSERT tb SELECT 'cc'GOINSERT tb SELECT NULLGOSELECT * FROM tbGODROP TABLE tb DROP FUNCTION dbo.f_check/*(2 row(s) affected)Msg 547, Level 16, State 0, Line 1The INSERT statement conflicted with the CHECK constraint "ck_tb". The conflict occurred in database "WebReport", table "dbo.tb", column 'a'.The statement has been terminated.(1 row(s) affected)a----------ccNULLNULL(3 row(s) affected)*/
  相关解决方案