Sql Server約束的學習二(檢查約束、默認約束、禁用約束)


接上一篇的Sql Server約束學習一(主鍵約束、外鍵約束、唯一約束)

4、檢查約束

1)檢查約束的定義

  檢查約束可以和一個列關聯,也可以和一個表關聯,因為它們可以檢查一個列的值相對於另一個列的值,只有這些列都在同一個表中,以及值是在更新或插入的同一行中。檢查約束還可以用於檢查列值組合是否滿足某一個標准。可以使用where子句一樣的規則來定義檢查約束。

  檢查約束條件示例如下:

2)檢查約束的創建

2.1)在創建表時創建檢查約束

/**創建表時創建檢查約束***/

--創建學生表--
create table Student(
    Uid int not null identity(1,1) primary key,  --主鍵約束--
    Name varchar(20) not null unique,  --唯一約束--
    Age int not null check(Age>=18),  --檢查約束--
    TeaUid int not null foreign key references Teacher(Uid),  --外鍵約束--
    Notes varchar(100) null
)

執行后,結果如下圖:

2.2)在已生成表新增檢查約束

/**創建表后,新增檢查約束***/

--創建學生表--
create table Student(
    Uid int not null identity(1,1) primary key,  --主鍵約束--
    Name varchar(20) not null unique,  --唯一約束--
    Age int not null,  --檢查約束--
    TeaUid int not null foreign key references Teacher(Uid),  --外鍵約束--
    Notes varchar(100) null
)
--創建表后,新增檢查約束--
alter table Student
add constraint CK_Student_Age
check(Age>=18)           --年齡大於等於18歲

執行后,結果如下圖所示:

3)檢查約束的驗證

--添加符合檢查條件的信息--
insert into Student(Name,Age,TeaUid) values('張小飛',18,2)
--添加不符合檢查條件的信息--
insert into Student(Name,Age,TeaUid) values('李小菲',16,2)
--查詢學生表信息--
select * from Student

執行后,結果如下圖:

5、默認約束

1)默認約束的定義

  默認約束也是表定義的一個組成部分,它定義了當插入的行對於定義了默認約束的列未提供相應數據是該怎么辦。可以定義一個字面值(年齡默認為0)或系統值(getdate())等。

  默認約束的特性:

     (1) 默認值只在insert語句中使用,在update、delete語句被忽略

  (2)如果在insert語句提供任意值,那就不使用默認值,若該列不提供值,則使用默認值

2)默認約束的創建

2.1)創建表時創建默認約束

/***在創建表時創建默認約束***/

--創建People表--
create table People(
    Uid int identity(1,1) primary key,  --主鍵約束--
    Name varchar(20) not null unique,   --唯一約束--
    HomeAdress varchar(50) not null default'未填寫',  --默認約束--
    Notes varchar(100) null
)

執行后,結果如下圖:

2.2) 創建表后,添加默認約束

/***在創建表后添加默認約束***/

--創建People表--
create table People(
    Uid int identity(1,1) primary key,  --主鍵約束--
    Name varchar(20) not null unique,   --唯一約束--
    HomeAdress varchar(50) not null,  --默認約束--
    Notes varchar(100) null
)
--添加默認約束--
alter table People
    add constraint DF_People_HomeAddress
    default '未填寫' for HomeAdress

執行后,結果如下圖:

3)默認約束的驗證

--不提供地址的新增信息--
insert into People values('張三')
--提供地址的新增信息--
insert into People(Name,HomeAdress) values('李四','廣州市海珠區')
--查詢People表--
select * from  People

執行后,結果如下圖:

6、禁用約束

1)禁用約束定義

  有時我們想暫時或永久消除約束,但sql server並沒有提供刪除約束的方法,只允許禁用外鍵約束或檢查約束,不能禁用主鍵約束和唯一約束,而同時保持約束的完整性。

  禁用一個數據完整性規則通常是因為有無效數據了,這樣的數據分為兩類:

  (1)在創建約束時已經存在數據庫中的數據

  (2)約束創建之后希望添加的數據

注:sql server允許禁用完整性檢查一段時間來例外的無效數據做處理,然后重新啟用完整性。

2)禁用約束創建

2.1)創建約束時,忽略之前不滿足數據

--創建People表--
create table People(
    Uid int identity(1,1) primary key,  --主鍵約束--
    Name varchar(20) not null unique,   --唯一約束--
    Age int not null,
    Notes varchar(100) null
)
--添加年齡小於18歲數據--
insert into People(Name,Age) values('小風',12)
--查詢People表--
select * from People

未加檢查約束,執行之后,結果如下:

當我們執行添加檢查約束,發現添加不了

--添加年齡必須大於等於18歲檢查約束--
alter table People
add constraint CK_People_Age 
check(Age>=18)

執行之后,結果如下圖:

那么如何忽略之前不滿足的數據呢?

--添加年齡必須大於等於18歲檢查約束--
alter table People
    with nocheck  --不檢查之前數據
    add constraint CK_People_Age   --檢查約束
    check(Age>=18)

執行后,結果如下圖:

添加大於18歲記錄

--添加大於18歲記錄--
insert into People(Name,Age) values('小溪',20)
--查詢People表--
select * from People

執行后,結果如下圖:

2.2)臨時禁用已存在的約束

  當我們需要從另一數據庫中導入數據到表中,而表中已建立了約束的時候,可能會存在一些數據和規則不匹配。當然有一個解決方式是先刪除約束,添加需要的數據,

然后with nocheck 在添加回去。但是這樣做太麻煩了。我們不需要這么做。我們可以采用名為nocheck的選項來運行alter語句,這樣就能夠取消需要的約束。

如之前創建檢查約束是這樣的

--添加年齡必須大於等於18歲檢查約束--
alter table People
    add constraint CK_People_Age   --檢查約束
    check(Age>=18)

那么要取消檢查約束可以這樣

--取消之前創建的檢查約束--    
alter table People
    nocheck constraint CK_People_Age

我們來測試臨時禁用已存在的約束

假如我們創建檢查約束是這樣的

--創建People表--
create table People(
    Uid int identity(1,1) primary key,  --主鍵約束--
    Name varchar(20) not null unique,   --唯一約束--
    Age int not null,
    Notes varchar(100) null
)
--添加年齡必須大於等於18歲檢查約束--
alter table People
    add constraint CK_People_Age   --檢查約束
    check(Age>=18)

當執行不符合檢查約束條件語句時

--執行不滿足條件的添加信息--
insert into People(Name,Age) values('張之洞',17)

返回結果如下圖:

執行臨時禁用檢查約束,結果如何呢?

--取消之前創建的檢查約束--    
alter table People
    nocheck constraint CK_People_Age    
--執行不滿足條件的添加信息--
insert into People(Name,Age) values('張之洞',17)
--查詢People表信息--
select * from People

執行后,結果如下圖:

3)約束是否啟用或關閉

3.1)如何查看約束是否啟用

--查詢People表的約束狀態--
sp_helpconstraint People

查詢結果如下:

3.2)如何啟用或關閉約束

--關閉檢查約束--
alter table People
    nocheck constraint CK_People_Age    
--啟用檢查約束--
alter table People
    check constraint CK_People_Age
--執行查詢People約束--
sp_helpconstraint Peopl

執行結果如下:

注:status_enabled的兩種狀態如下: (1)Enabled:啟用   (2)Disabled:禁用

學習網址:

http://www.cnblogs.com/kissdodog/archive/2013/05/31/3109509.html


免責聲明!

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



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