【问题标题】:SQL Conditional Unique Constraint With Where Clause Within Same TableSQL条件唯一约束与同一个表中的where子句
【发布时间】:2014-02-24 12:24:10
【问题描述】:

我有一个表,我想确保五列的组合在该表中保持唯一。例如:

ALTER TABLE [dbo].[MyTable] 
    ADD CONSTRAINT [UQ__MyTable.MFG.Model.Class.Depiction.Iteration] 
        UNIQUE NONCLUSTERED 
        (
         [ManufacturerID] ASC,
         [Model] ASC,
         [BlockClassID] ASC,
         [BlockDepictionID] ASC,
         [BlockIterationID] ASC
        )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, 
            SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, 
            ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) 
    ON [PRIMARY]
GO

我想排除第六个单独列具有特定值的组合。例如,我只想在 [Flag] = 0 列时强制执行上述约束,而在 [Flag] = 1 列时排除强制执行。

【问题讨论】:

  • 这听起来像是复合主键。但它必须在所有行上完成。如果您想要仅基于第 6 列有效的复合唯一键,则需要编写 INSTEAD OF 触发器。
  • 另外 - 对于这个表,PK 有一个单独的 ID 列 [int] IDENTITY。

标签: sql sql-server sql-server-2008-r2 conditional unique-constraint


【解决方案1】:

作为解决方法,您可以通过创建唯一的过滤索引在 SQL Server 2008 及更高版本中获得正确的 ANSI 行为。

CREATE UNIQUE NONCLUSTERED INDEX [IX__MyTable.MFG.Model.Class.Depiction.Iteration] 
ON [dbo].[MyTable] ([ManufacturerID],[Model],[BlockClassID],[BlockDepictionID],[BlockIterationID])
WHERE [Flag] = 0;

TechNet article

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-22
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 2010-10-26
    • 1970-01-01
    • 2012-05-07
    相关资源
    最近更新 更多