首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

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

2012-01-19 
创建“允许为空,但不为空时不能重复”的约束我有一个字符串(最长18位)的列,要求创建“允许为空,但不为空时不

创建“允许为空,但不为空时不能重复”的约束
我有一个字符串(最长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)*/ 

热点排行