在多列上检查约束
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】:您可以简单地在表上的触发器中应用您的验证,尤其是如果检查失败,操作将回滚。
【讨论】:
以上是关于在多列上检查约束的主要内容,如果未能解决你的问题,请参考以下文章