sql语句建表,其中一列数据的值是唯一的,但允许有多个空值。不是unique约束,unique不允许有多个空值。

对这个属性的约束要怎么写啊?unique最多只允许一个空值,而我要实现的是除空值以外的其他的值要唯一,我这里有多个空值啊。... 对这个属性的约束要怎么写啊?unique最多只允许一个空值,而我要实现的是除空值以外的其他的值要唯一,我这里有多个空值啊。 展开
 我来答
xpresslink
2012-12-27 · TA获得超过3705个赞
知道小有建树答主
回答量:272
采纳率:87%
帮助的人:99.6万
展开全部
假设要实现约束的列名为C1, 所在表名为MyTable

(1)除了SQL SERVER 以外的大型数据库都是允许 UNIQUE约束有多个空值的。

(2)SQL Server 2008中有了一个解决方案,那就是筛选索引。

CREATE UNIQUE NONCLUSTERED INDEX MyTable
ON MyTable(C1)
WHERE C1 is not null
GO

(3)SQL Server 2008以下版两个方案

A、使用触发器在插入和更新时控制
CREATE trigger Mytrigger on MyTable for insert, update as
BEGIN
IF (select max(cnt) from (select count(i.c1)
as cnt from MyTable, inserted i where MyTable.c1=i.c1 group
by i.c1) x) > 1
ROLLBACK TRAN
END

B、 在约束中使用自建函数来实现

创建验证逻辑函数
CREATE FUNCTION [dbo].[fn_CK_MyTable_C1]()
RETURNS BIT
AS
BEGIN
IF(EXISTS(
SELECT 1
FROM MyTable AS a
WHERE (C1 IS NOT NULL) AND EXISTS
(SELECT 1 AS Expr1
FROM MyTable
WHERE (C1 IS NOT NULL) AND (C1 = a.C1) )
))
RETURN 0

RETURN 1
END
GO

在约束中引用函数:

ALTER TABLE test_tb
ADD CONSTRAINT CK_MyTable_C1 CHECK (dbo.fn_CK_MyTable_C1() = 1)
GO
BuddhaQQ
2012-12-27 · TA获得超过1763个赞
知道小有建树答主
回答量:860
采纳率:100%
帮助的人:980万
展开全部
用触发器实现吧,给你个思路
插入时对该列判断是否为空,为空的直接插入
非空的,以插入值查询现有数据,如存在则拒绝插入
不存在,则完成插入
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式