Sql-Server
我可以強制一個欄位依賴於另一個欄位嗎?
我想知道是否可以
bit
在同一個表中有兩個欄位(在本例中為 s),其中一個欄位依賴於另一個欄位。例如Check2
,僅當為真時才Check1
為真。注意:我正在嘗試實施約束以嘗試完成此操作,但到目前為止失敗了。我承認我在約束方面的經驗有限。這是一個新數據庫,數據很少,表中目前沒有上述條件不成立的條目。也就是說,沒有記錄在哪裡
Check2
是真實的。
您可以將
CHECK
約束與CASE
表達式一起使用。如果check2
已啟用,請確保check1
也已啟用,否則您可以預設為無操作(“檢查”check1 = check1)。為簡單起見,我假設這些列不可NULL
用。CREATE TABLE dbo.foo ( check1 BIT NOT NULL DEFAULT 0, check2 BIT NOT NULL DEFAULT 0, CONSTRAINT ck_both CHECK (check1 = CASE WHEN check2 = 1 THEN 1 ELSE check1 END) ); INSERT dbo.foo DEFAULT VALUES; -- 0,0 succeeds INSERT dbo.foo(check1,check2) VALUES(1,0); -- succeeds INSERT dbo.foo(check1,check2) VALUES(1,1); -- succeeds GO INSERT dbo.foo(check1,check2) VALUES(0,1); -- fails
將此約束添加到現有表中:
ALTER TABLE dbo.tablename ADD CONSTRAINT ck_BothBits CHECK (check1 = CASE WHEN check2 = 1 THEN 1 ELSE check1 END);
如果這些列
NULL
能夠(希望它們不是),您可以這樣說(未經測試):ALTER TABLE dbo.tablename ADD CONSTRAINT ck_BothBits CHECK (COALESCE(check1,0) = CASE WHEN check2 = 1 THEN 1 ELSE COALESCE(check1,0) END);
有了這個約束:
INSERT dbo.foo(check1,check2) VALUES(NULL,NULL) -- succeeds INSERT dbo.foo(check1,check2) VALUES(1,0); -- succeeds INSERT dbo.foo(check1,check2) VALUES(1,1); -- succeeds INSERT dbo.foo(check1,check2) VALUES(1,NULL); -- succeeds INSERT dbo.foo(check1,check2) VALUES(0,NULL); -- succeeds INSERT dbo.foo(check1,check2) VALUES(NULL,0); -- succeeds GO INSERT dbo.foo(check1,check2) VALUES(0,1); -- fails GO INSERT dbo.foo(check1,check2) VALUES(NULL,1); -- fails