在多列上检查约束

Posted

技术标签:

【中文标题】在多列上检查约束【英文标题】:CHECK CONSTRAINT on multiple columns 【发布时间】:2010-08-09 07:24:12 【问题描述】:

我使用 SQL Server 2008

我在同一个表中的多个列上使用 CHECK CONSTRAINT 来尝试验证数据输入。

我收到一个错误:

列的 CHECK 约束 'AAAA' 引用另一列, 表'XXXX'。

CHECK CONSTRAINT 不能以这种方式工作。

还有其他方法可以在不使用 FK 的情况下在单个表上实现吗?

谢谢

这是我的代码示例

CREATE TABLE dbo.Test 
(   
EffectiveStartDate  dateTime2(2)        NOT NULL,
EffectiveEndDate    dateTime2(2)        NOT NULL
    CONSTRAINT CK_CmsSponsoredContents_EffectiveEndDate CHECK (EffectiveEndDate > EffectiveStartDate),
);

【问题讨论】:

为什么“没有 FK”?外键设计是为了链接两个表 - 这是他们的核心能力,他们的工作,他们存在的理由 - 为什么不使用 FK,而这实际上是 FK 的工作??? 我将代码添加到我的问题中,希望现在更有意义。 【参考方案1】:

是的,在 table 级别定义 CHECK CONSTRAINT

CREATE TABLE foo (
   bar int NOT NULL, 
   fred varchar(50) NOT NULL,

   CONSTRAINT CK_foo_stuff CHECK (bar = 1 AND fred ='fish')
)

您将其内联声明为 约束

...
fred varchar(50) NOT NULL CONSTRAINT CK_foo_fred CHECK (...)
...

编辑,发布比描述更容易。修正了你的逗号。

CREATE TABLE dbo.Test 
(   
  EffectiveStartDate  dateTime2(2)        NOT NULL,
  EffectiveEndDate    dateTime2(2)        NOT NULL,  --need comma
  CONSTRAINT CK_CmsSponsoredContents_EffectiveEndDate CHECK (EffectiveEndDate > EffectiveStartDate) --no comma
);

当然,问题仍然存在,您是否使用了应该是 FK 约束的 CHECK 约束...?

【讨论】:

嗨我测试了你的代码和他的工作,我在我原来的问题上发布了我的问题,因为它非常相似但不起作用。有任何想法吗?感谢您的宝贵时间 +1 虽然我认为从逻辑上讲约束是在行级别定义的。表级 CHECK 约束将能够引用同一表中不同行中的数据,这是 SQL Server 不直接支持的。 @onedaywhen:CK 约束是每行总是。 “表级别”是指附加到表格,而不是附加到列。 @onedaywhen:请参阅msdn.microsoft.com/en-us/library/ms189862.aspx“列和表约束” “逻辑上,约束是在行级别定义的”——注意“逻辑上”这个词。您可以在逻辑上在每个级别都有约束:(列、域、行、表、模式、数据库、企业、全局)。 SQL Server 文档反映了该产品仅支持两个物理级别的 CHECK 约束,称为“列”和“表”,但在逻辑上分别是列级别和行级别。【参考方案2】:

检查约束可以引用单个列或整条记录。

将此语法用于记录级约束:

ALTER TABLE MyTable
ADD CONSTRAINT MyCheck
CHECK (...your check expression...)

【讨论】:

【参考方案3】:

您可以简单地在表上的触发器中应用您的验证,尤其是如果检查失败,操作将回滚。

【讨论】:

以上是关于在多列上检查约束的主要内容,如果未能解决你的问题,请参考以下文章

在多列上创建复合唯一约束

HSQLDB 索引和多列约束

check约束叫啥约束?

CoreData(IOS)多列的唯一约束?

多列的唯一约束

多列约束查询