2010-08-09 157 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

您可以簡單地套用您的驗證在觸發器在桌子上尤其是無論哪種方式,如果檢查失敗的操作將被回滾。