Sql-Server

基於其他列的約束

  • August 8, 2017

是否可以根據行中的其他值來限制列中允許的值?

例如,我的表:

ID  Test_mode  Active
--  ---------  ------
1   1          Null
2   0          1
3   1          0

如果將 a插入,有沒有辦法改變 to 的Test_mode0``1``Active

要麼

如果Test_mode為 1,則不允許插入/更新Active

要麼

如果為 1 並嘗試Test_mode插入/更新,則拋出某種錯誤。Active

Active只能為 NULL、1、0,並且只有 1 和Test_modeas 0。

我希望這是有道理的,如果不讓我知道,我會更新問題。

首先,歡迎來到 dba.stackexchange.com 並感謝您的文章!

是否可以根據行中的其他值來限制列中允許的值。

是的,使用此處描述的CHECK CONSTRAINTS

例子 :

create table myTable (ID int identity(1,1)
                       , Test_mode int
                       , Active int 
                       )
go

-- Active can only be NULL, 1, 0, AND only 1 with Test_mode as 0.
ALTER TABLE myTable WITH CHECK ADD 
  CONSTRAINT ck_active CHECK (active IS NULL OR active IN (1, 0)) 
  go

-- some test data
insert into myTable (test_mode, Active) values (1, null)
insert into myTable (test_mode, Active) values (0, null)
insert into myTable (test_mode, Active) values (1, 0)
insert into myTable (test_mode, Active) values (0, 1)
insert into myTable (test_mode, Active) values (1, 1)

select * from myTable

-- Is there a way to either change the value of Test_mode to 0 if a 1 is inserted into Active

update myTable
set Test_mode = case when Active = 1 then  0
       else Test_mode 
       end
where Active = 1

如果Test_mode為 1,則不允許插入/更新 Active –OR– 如果 Test_mode 為 1 並且嘗試插入/更新 Active,則拋出某種錯誤。

如此處所述使用 TRY/CATCH

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