数据库唯一与允许空约束怎么解决?

xiaocai0001 2007-07-11 11:11:38
遇到一个问题, 对数据库表中某一列要求允许为空, 若值不空时要求满足唯一约束

不知道这样的约束是数据库层能不能实现?
...全文
663 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
houyichong 2007-07-12
  • 打赏
  • 举报
回复
多加一个相同的列,名字不同,一列用unique,一类允许为null,查询的时候具体情况具体分析就是了
zonelive 2007-07-12
  • 打赏
  • 举报
回复
check (f_a(name)=0 or name is null)

create function dbo.f_a(@name nvarchar(20))
returns tinyint
as
begin
declare @n tinyint
if not exists(select 1 from tbname where name=@name)
set @n=0
else set @n=0 return @n end 大概就这样
jwt1982 2007-07-12
  • 打赏
  • 举报
回复
直接写约束是不能实现地

就1个空显然不符合楼主需要

考虑触发器吧
bitm 2007-07-12
  • 打赏
  • 举报
回复
学习了
ezhuyin 2007-07-12
  • 打赏
  • 举报
回复
表触发,刚才有几个错误。用这个试试看。

CREATE TRIGGER TR_T1_INSERT
ON [dbo].[T1]
FOR INSERT, UPDATE
AS
DECLARE @COLUMN_VALUE varchar(40), @ID bigint -- 假定你的类型是varchar

SET @COLUMN_VALUE = (SELECT C1 FROM inserted) -- 这里设定C1是字段名
SET @ID = (SELECT ID FROM inserted) -- 这里设定你的索引是ID

-- 空值直接返回不做处理
IF @COLUMN_VALUE IS NULL
BEGIN
RETURN
END

-- 非空判断后处理
IF @COLUMN_VALUE LIKE 'ALLOW%'
BEGIN
RETURN -- 满足条件返回
END
ELSE
BEGIN
DELETE FROM T1 WHERE ID=@ID -- 不满足条件删除
END
ezhuyin 2007-07-12
  • 打赏
  • 举报
回复
CREATE TRIGGER TR_T1_INSERT
ON [dbo].[T1]
FOR INSERT, UPDATE
AS
DELCARE @COLUMN_VALUE varchar(40), @ID bigint -- 假定你的类型是varchar

SET @COLUMN_VALUE = (SELECT C1 FROM inserted) -- 这里设定C1是字段名
SET @ID = (SELECT ID FROM inserted) -- 这里设定你的索引是ID

-- 空值直接返回不做处理
IF @C1 IS NULL
BEGIN
RETURN
END

-- 非空判断后处理
IF @C1 LIKE 'ALLOW%'
BEGIN
RETURN -- 满足条件返回
END
ELSE
BEGIN
DELETE FROM T1 WHERE -- 不满足条件删除
ID=@ID
fa_ge 2007-07-11
  • 打赏
  • 举报
回复
這樣的是沒有的吧
fa_ge 2007-07-11
  • 打赏
  • 举报
回复
unique 和 primary key 唯一區別是unique允許為空,primary key 不能為空
xiaocai0001 2007-07-11
  • 打赏
  • 举报
回复
是的Unique约束可以允许为空, 但只能允许一个空值的存在.

我需要的是如果值是null, 不管它, 只有非空时才进行唯一性约束.
fa_ge 2007-07-11
  • 打赏
  • 举报
回复
alter table t
add constraint cons_aa unique (aa)
fa_ge 2007-07-11
  • 打赏
  • 举报
回复
當然可以了
unique 就是了,約束無重復值,但允許為空
xmlquit 2007-07-11
  • 打赏
  • 举报
回复
應該是不可以
ezhuyin 2007-07-11
  • 打赏
  • 举报
回复
用触发表,每次进去数据的时候检查,如果不符合条件直接去除掉。
master_leo 2007-07-11
  • 打赏
  • 举报
回复
学习了
楼主写个函数试试
zonelive 2007-07-11
  • 打赏
  • 举报
回复
SQLSERVER本身不支持,但是可以自己写函数在约束那里实现,我以前写过,很简单的

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧