大家知道,關系型數據庫的邏輯運算的結果是三值型的,TRUE,FALSE和UNKNOWN,特別是,NULL值和任何值都不相等,任何值和NULL的比較,返回的邏輯結果都是unknown。而NULL值在唯一約束和Check約束中的表現,不同於NULL值的定義。
唯一(Unique)約束在內部使用唯一索引來保證列值的唯一性。在一個列上創建唯一約束(unique)之后,該列允許插入null值,通常情況下,兩個null值是不相等的,但是在唯一約束中,unique約束把兩個null值看作是相同的,也就是說,null和null是相等的,null和其他任何非null值都不相等。
Check約束用以限制單列的可能取值范圍,在check約束中(check(expression)),如果expression返回的結果是Unknown,那么check約束返回的結果是true。這就意味着,如果expression的值是null,那么該表達式的值滿足check約束。
一,唯一約束
唯一約束可以創建在列級別上,也可以在表級別上。在列級別上, default 約束定義的語法是:分為column level和table level,區別在於Table Level需要制定unique約束影響的column(or columns)。
列級別定義的唯一約束的語法是:
column_name <data_type>[ CONSTRAINT constraint_name ] UNIQUE
表級別定義的唯一約束的語法是:
[ CONSTRAINT constraint_name ] UNIQUE(column [ ASC | DESC ] [ ,...n ] )
二,向現有表上增加唯一約束
1,增加unique約束
alter table dbo.dt_test_unique add constraint uq_test_id unique nonclustered(id)
2,刪除unique約束
alter table dbo.dt_test_unique drop constraint uq_test_id
3,修改unique約束
不能在現存的表上修改unique約束,變通的方法是先刪除 unique約束,后增加一個新的unique約束
alter table dbo.dt_test_unique drop constraint uq_test_id alter table dbo.dt_test_unique add constraint uq_test_id unique nonclustered(id)
三,Check約束
Check約束用以限制單列的可能取值范圍,需要在Check約束中指定邏輯表達式,該邏輯表達式必須返回邏輯值(TRUE或FALSE),在Check中,把UNKNOWN值認為是TRUE。
check(expression)
1,在check約束中
如果expression返回的結果是Unknown,那么check返回的結果是true。
create table dbo.dt_check ( id int null constraint ck_ID_is_Positive check(id>0) )
插入數據,測試check約束的工作機制
insert into dbo.dt_check values(null) insert into dbo.dt_check values(1) insert into dbo.dt_check values(0)
INSERT 語句與 CHECK 約束"ck_ID_is_Positive"沖突。該沖突發生於數據庫"db_study",表"dbo.dt_check", column 'id'。
語句已終止。
NULL和1 插入成功,而0插入失敗。
2,在表級別上定義Check約束
在表級別上定義Check約束,可以對多列的可能取值進行限制
create table dbo.dt_check ( id int null , code int null, constraint ck_IDCode_is_Positive check(id>0 and code >0) )
在一個已經創建的table上,通過alter table命令來增加、修改和刪除check約束,添加的約束是表級別的約束
3,增加check約束
alter table dbo.dt_check add constraint ck_ID_is_Positive check(id>0)
4,刪除check約束
alter table dbo.dt_check drop constraint ck_ID_is_Positive
5,修改Check約束
沒法直接修改Check約束,變通方法是:必須先刪除約束,然后添加新的check約束
alter table dbo.dt_check drop constraint ck_ID_is_Positive alter table dbo.dt_check add constraint ck_ID_is_Positive check(id>0)
6,通過alter table命令增加新的列,並在列級別上創建check 約束
alter table dbo.dt_check add sex char(1) not null constraint ck_sex check(sex in('M','F'))
參考文檔: