2010-02-17 151 views
3

我有一個包含兩個鏈接列的表,一個強制布爾值和一個可選日期。布爾值爲FALSE時只能有一個日期。所以我有這樣的結構:更新時的約束違規

CREATE TABLE FOO (
    FOO_ID INT IDENTITY(1, 1) NOT NULL, 
    MY_DATE DATETIME, 
    MY_BOOLEAN BIT DEFAULT 0 NOT NULL, 

    CONSTRAINT FOO_PK PRIMARY KEY (FOO_ID) 
); 

而且我已經寫了這個限制,以保持數據的完整性:

ALTER TABLE FOO 
ADD CONSTRAINT FOO_CHK CHECK (
    MY_BOOLEAN=0 OR MY_DATE IS NULL 
); 

我必須失去了一些東西很明顯,但事實是,我無法運行此更新查詢:

UPDATE FOO 
SET 
    MY_BOOLEAN=1, 
    MY_DATE=NULL 
WHERE FOO_ID=31416 

我得到一個檢查約束衝突錯誤,更新失敗。我究竟做錯了什麼?


UPDATE

很遺憾地告訴我已經輸錯列名...對不起,浪費你的時間。我希望我能刪除的問題:_(

+0

錯誤應該告訴**哪個**約束失敗,是否說'FOO_CHK'是原因? –

+0

InstrucciónUPDATE en contrto con lalaracciónCHECK「FOO_CHK」。El conflicto ha_aparecido en la base de datos「MY_DATABASE」,tabla「dbo.FOO」。 –

回答

0

對不起,虛假的問題(自回答似乎讓?是唯一的方法來關閉它)

2

我用這個腳本測試這一點,並沒有錯誤是否有任何其他約束

CREATE TABLE FOO (
    FOO_ID INT IDENTITY(1, 1) NOT NULL, 
    MY_DATE DATETIME, 
    MY_BOOLEAN BIT DEFAULT 0 NOT NULL, 

    CONSTRAINT FOO_PK PRIMARY KEY (FOO_ID) 
); 
ALTER TABLE FOO 
ADD CONSTRAINT FOO_CHK CHECK (
    MY_BOOLEAN=0 OR MY_DATE IS NULL 
); 

set identity_insert foo on 
insert into foo(FOO_ID, my_date, MY_BOOLEAN) 
select 31416, '20090101', 0 
set identity_insert foo off 

UPDATE FOO 
SET 
    MY_BOOLEAN=1, 
    MY_DATE=NULL 
WHERE FOO_ID=31416 
+0

+1,並驗證CHECK的工作原理:'更新FOO設置MY_BOOLEAN = 1,MY_DATE = getdate()WHER E FOO_ID = 31416' –

+0

你說得對,它只適用於這兩列......還有一些其他的限制,但它們都不影響布爾和日期,而且錯誤信息非常明確:它責怪這個具體約束: - ? –

+0

請提供全部表格創建腳本以及所有(檢查)約束 – edosoft