SQL CHECK约束逻辑

时间:2014-04-14 05:16:40

标签: sql sql-server

我有一个名为'DailyAllocations'的表,其中有一个名为“已删除”的软删除标记(DATETIME, NULLABLE),另一个名为ProcessHistoryIDINT, NULLABLE)的重要列

我需要在表中添加一个约束,这不允许软删除行,而ProcessHistoryID中有一个值。

ALTER TABLE dbo.DailyAllocation
ADD CONSTRAINT chk_dont_delete_processed CHECK ((Deleted IS NULL AND ProcessHistoryID IS NULL) OR (Deleted IS NOT NULL AND ProcessHistoryID IS NULL))

但即使我的数据有效,当我尝试应用容器时它也会失败:

  

ALTER TABLE语句与CHECK约束冲突   “chk_dont_delete_processed”。冲突发生在数据库中   “MyDB”,表“dbo.DailyAllocation”。

这可能是我的逻辑,否则,我正在做一些奇怪的事情。

因此,您不能使用ProcessHistoryID删除已删除的行。我做错了什么?

以下查询不返回任何结果,这意味着数据当前是干净的:

SELECT *  FROM dbo.DailyAllocation WHERE Deleted IS NOT NULL AND ProcessHistoryID IS NOT NULL

1 个答案:

答案 0 :(得分:3)

使用此规则NOT (Deleted IS NOT NULL AND ProcessHistoryID IS NOT NULL)更容易 - 反转单个不允许组合的结果。