約束4:唯一約束,Check約束和null


大家知道,關系型數據庫的邏輯運算的結果是三值型的,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'))

 

參考文檔:

SQLServer - 約束

SQL Server中約束的介紹

table_constraint (Transact-SQL)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM