小编Dan*_*ler的帖子

根据另一列值强制一列唯一

我想让一列唯一,但前提是不同的列是特定值。

考虑下表:

CREATE TABLE [SampleTable]
(
     [Id] INTEGER NOT NULL IDENTITY(1,1)
    ,CONSTRAINT [PK_SampleTable]
        PRIMARY KEY ([Id])

    ,[Code]      NVARCHAR(255) NOT NULL
    ,[Deleted]   BIT           NOT NULL DEFAULT 0
    ,[CreatedOn] DATETIME      NOT NULL DEFAULT GETDATE()
);
Run Code Online (Sandbox Code Playgroud)

目的是可以通过将[Deleted]列设置为 1来“删除”项目。

我想要的是将[Code]列强制为唯一,但仅在未删除的行中

在数据库级别强制执行数据正确性通常是我的强烈偏好。但是,我过去经常使用这种模式,但一直不确定是否可以在数据库级别强制实施这种约束。截止日期的压力是什么,我从来没有费心去发现。所以我一直只是在应用程序级别强制执行它们。

如果有办法做到这一点,我真的很想知道它是什么。

需要明确的是,我不能只使用组合唯一约束,因为我需要能够支持以下数据:

    [ID]   [Code]   [Deleted]  [CreatedOn]
=====================================================================
     1     'ABC'    1          Ages ago
     2     'ABC'    1          A while ago
     3     'ABC'    1          Quite recently, actually
     4     'ABC'    0          Just a moment ago!
Run Code Online (Sandbox Code Playgroud)

组合的唯一约束将不起作用,因为就我而言,具有相同代码的三个不同的“已删除”条目是有效的。

我问这个问题是因为最近在集成来自第三方应用程序的数据时,“在应用程序级别强制执行”策略让我感到很恼火。如果数据库直接拒绝错误的集成数据会很好,因为在集成发生之前修复它比在错误发生后清理数据容易得多。

我正在使用 SQL Server 2008 …

sql-server constraint t-sql sql-server-2008-r2

6
推荐指数
1
解决办法
9327
查看次数