【发布时间】:2010-10-26 08:21:59
【问题描述】:
我有一种情况,我需要对一组列实施唯一约束,但仅限于一列的一个值。
例如,我有一个像 Table(ID, Name, RecordStatus) 这样的表。
RecordStatus 只能有值 1 或 2(活动或已删除),并且我只想在 RecordStatus = 1 时对 (ID, RecordStatus) 创建唯一约束,因为我不在乎是否有多个已删除记录具有相同的 ID。
除了写触发器,我还能这样做吗?
我使用的是 SQL Server 2005。
【问题讨论】:
-
这种设计是一种常见的痛苦。您是否考虑过更改设计,以便从表中物理删除名义上“已删除”的记录,并可能将其移至“存档”表?
-
...因为无法编写 UNIQUE 约束来强制执行简单的键应被视为“代码气味”,IMO。如果您无法更改设计(SQL DDL),因为许多其他表都引用了该表,那么我敢打赌您的 SQL DML 也会因此受到影响,即您必须记住添加 ...AND Table.RecordStatus = 1'对于大多数涉及此表的搜索条件和连接条件,并且在有时不可避免地被省略时会遇到一些细微的错误。
标签: sql sql-server sql-server-2005