2010-08-09 133 views
18

我使用SQL Server 2008检查约束

我用在同一个表的多个列的检查约束,试图验证输入的数据。

我收到一个错误:

Column CHECK constraint for column 'AAAA' references another column, table 'XXXX'.

CHECK约束不以这种方式工作。

任何其他方式不使用FK在单个表上实现这一点?

感谢

这里我的代码示例

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

为什么“没有FK”?外键是设计**连接两张表 - 这是他们的核心能力,他们的工作,他们的理由是 - 为什么不使用FK,当它真的是FK的工作? – 2010-08-09 07:28:47

+0

我将我的代码添加到我的问题中,希望现在更有意义。 – GibboK 2010-08-09 07:45:55

回答

40

是,定义CHECK约束在水平

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 
); 

当然,问题仍然是您使用CHECK约束,它应该是一个FK约束......?

+0

嗨我测试你的代码和他的工作,我张贴我的原始问题,因为它非常相似,但不起作用。有任何想法吗?感谢您的时间 – GibboK 2010-08-09 07:55:18

+0

+1,但我认为逻辑上约束是在行级定义的。表级CHECK约束将能够在同一个表中的不同行中引用数据,这是SQL Server不直接支持的。 – onedaywhen 2010-08-09 12:52:30

+0

@onedaywhen:每个行的CK约束总是* *。 “表级”是指附加到表,而不是附加到列。 – gbn 2010-08-09 13:03:20

2

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

使用此语法记录等级限制:

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

您可以简单地套用您的验证在触发器在桌子上尤其是无论哪种方式,如果检查失败的操作将被回滚。