首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >条件唯一约束

条件唯一约束
EN

Stack Overflow用户
提问于 2009-05-14 21:57:07
回答 5查看 63.9K关注 0票数 102

在这种情况下,我需要对一组列强制执行唯一约束,但只对一列的一个值执行唯一约束。

例如,我有一个类似Table(ID,Name,RecordStatus)的表。

RecordStatus只能有一个值1或2(活动的或已删除的),并且我希望仅当RecordStatus =1时才在( ID,RecordStatus)上创建唯一约束,因为我不关心是否有多个删除的记录具有相同的ID。

除了编写触发器之外,我还可以这样做吗?

我使用的是SQL Server 2005。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-05-14 22:06:04

像这样添加一个检查约束。不同之处在于,如果Status =1且Count > 0,则返回false。

http://msdn.microsoft.com/en-us/library/ms188258.aspx

CREATE TABLE CheckConstraint
(
  Id TINYINT,
  Name VARCHAR(50),
  RecordStatus TINYINT
)
GO

CREATE FUNCTION CheckActiveCount(
  @Id INT
) RETURNS INT AS BEGIN

  DECLARE @ret INT;
  SELECT @ret = COUNT(*) FROM CheckConstraint WHERE Id = @Id AND RecordStatus = 1;
  RETURN @ret;

END;
GO

ALTER TABLE CheckConstraint
  ADD CONSTRAINT CheckActiveCountConstraint CHECK (NOT (dbo.CheckActiveCount(Id) > 1 AND RecordStatus = 1));

INSERT INTO CheckConstraint VALUES (1, 'No Problems', 2);
INSERT INTO CheckConstraint VALUES (1, 'No Problems', 2);
INSERT INTO CheckConstraint VALUES (1, 'No Problems', 2);
INSERT INTO CheckConstraint VALUES (1, 'No Problems', 1);

INSERT INTO CheckConstraint VALUES (2, 'Oh no!', 1);
INSERT INTO CheckConstraint VALUES (2, 'Oh no!', 2);
-- Msg 547, Level 16, State 0, Line 14
-- The INSERT statement conflicted with the CHECK constraint "CheckActiveCountConstraint". The conflict occurred in database "TestSchema", table "dbo.CheckConstraint".
INSERT INTO CheckConstraint VALUES (2, 'Oh no!', 1);

SELECT * FROM CheckConstraint;
-- Id   Name         RecordStatus
-- ---- ------------ ------------
-- 1    No Problems  2
-- 1    No Problems  2
-- 1    No Problems  2
-- 1    No Problems  1
-- 2    Oh no!       1
-- 2    Oh no!       2

ALTER TABLE CheckConstraint
  DROP CONSTRAINT CheckActiveCountConstraint;

DROP FUNCTION CheckActiveCount;
DROP TABLE CheckConstraint;
票数 40
EN

Stack Overflow用户

发布于 2009-05-14 22:01:58

您可以将删除的记录移动到缺少约束的表中,也可以使用两个表的UNION视图来保留单个表的外观。

票数 12
EN

Stack Overflow用户

发布于 2009-05-14 22:43:30

你可以用一种非常老套的方式...

在您的表上创建schemabound视图。

CREATE VIEW WHERE SELECT * FROM RecordStatus =1的表

现在,使用所需的字段在视图上创建一个唯一约束。

关于模式绑定视图,需要注意的一点是,如果您更改了底层表,则必须重新创建视图。由于这一点,很多人都被骗了。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/866061

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档