Sql-Server

我可以強制一個欄位依賴於另一個欄位嗎?

  • September 15, 2015

我想知道是否可以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

引用自:https://dba.stackexchange.com/questions/94211