SQL Server使用檢查約束來驗(yàn)證數(shù)據(jù)實(shí)戰(zhàn)演示
以下文章主要是介紹在SQL Server使用檢查約束來驗(yàn)證數(shù)據(jù)的實(shí)際操作步驟,以及對(duì)其在實(shí)際操作中要用到的一些事項(xiàng)的描述,下面的文章就是對(duì)SQL Server使用檢查約束來驗(yàn)證數(shù)據(jù)的實(shí)際操作步驟的相關(guān)內(nèi)容的具體介紹。
什么是檢查約束?
檢查約束是一個(gè)規(guī)則,它確認(rèn)一個(gè)SQL Server表中某條記錄中的數(shù)據(jù)可接受的字段值。檢查約束幫助執(zhí)行域完整性。域完整性定義了一個(gè)數(shù)據(jù)庫表中字段的有效值。檢查約束可以驗(yàn)證一個(gè)單獨(dú)字段或一些字段的域完整性。你對(duì)一個(gè)單獨(dú)的字段可以有多個(gè)檢查完整性。假如被插入或更新的數(shù)據(jù)違反了一個(gè)檢查約束,那么數(shù)據(jù)庫引擎將不答應(yīng)這個(gè)插入或更新的操作發(fā)生。
創(chuàng)建檢查約束
1 創(chuàng)建字段級(jí)別的檢查約束
- CREATE TABLE CHECKTABLE(
 - pid INT PRIMARY KEY,
 - cname VARCHAR(500) NOT NULL,
 - age INT,
 - CHECK(age>0)
 - )
 
這是一個(gè)字段級(jí)別的約束。這個(gè)檢查約束只答應(yīng)age字段大于0。當(dāng)我的表創(chuàng)建之后,這個(gè)CHECK約束也將被創(chuàng)建,并被賦予一個(gè)系統(tǒng)生成的約束名稱。
假如你想在一個(gè)CREATE TABLE操作期間命名你的檢查約束,那么你可以運(yùn)行下面的代碼:
- CREATE TABLE CHECKTABLE(
 - pid INT PRIMARY KEY,
 - cname VARCHAR(500) NOT NULL,
 - age INT,
 - CONSTRAINT CK_CheckTable_Age CHECK(age>0)
 - )
 
一個(gè)檢查約束表達(dá)式可以有多個(gè)條件。下面是一個(gè)例子,它顯示了一個(gè)有多個(gè)條件的檢查約束:
- CREATE TABLE CHECKTABLE(
 - pid INT PRIMARY KEY,
 - cname VARCHAR(500) NOT NULL,
 - age INT,
 - CONSTRAINT CK_CheckTable_Age CHECK(age>0 AND age<100)
 - )
 
SQL Server使用檢查約束來驗(yàn)證時(shí)假如你想創(chuàng)建一個(gè)表級(jí)別的檢查約束,那么你可以運(yùn)行下面的代碼:
- CREATE TABLE CHECKTABLE(
 - pid INT PRIMARY KEY,
 - cname VARCHAR(500) NOT NULL,
 - age INT,
 - sex BIT,
 - CHECK(age>0 AND age<100 AND sex IN (0,1))
 - )
 
有時(shí),在你設(shè)計(jì)和創(chuàng)建了一個(gè)表后,你想對(duì)一個(gè)表添加一個(gè)檢查約束。這可以通過使用ALTER TABLE 語句來完成:
- ALTER TABLE CHECKTABLE
 - WITH NOCHECK ADD CONSTRAINT CK_CheckTable_Sex
 - CHECK (sex IN (0,1));
 - ALTER TABLE CHECKTABLE
 - WITH NOCHECK ADD CONSTRAINT CK_CheckTable_Sex
 - CHECK (sex IN (0,1) AND cname IN ('zy','zs'));
 
你可以使用一個(gè)單獨(dú)的ALTER TABLE語句來一次添加多個(gè)檢查約束到你的表中:
- ALTER TABLE CHECKTABLE
 - WITH NOCHECK ADD CONSTRAINT CK_CheckTable_Sex
 - CHECK (sex IN (0,1)),
 - CONSTRAINT CK_CheckTable_Sex
 - CHECK (cname IN ('zy','zs'));
 
比較特別是的,字段中的NULL值可能答應(yīng)你輸入數(shù)據(jù)到你的數(shù)據(jù)庫中,而這并不滿足你的需求。
- ALTER TABLE CHECKTABLE
 - WITH NOCHECK ADD CONSTRAINT CK_CheckTable_Sex
 - CHECK (sex IN (0,1)),
 - CONSTRAINT CK_CheckTable_Sex
 - CHECK (cname IN ('zy','zs'));
 
針對(duì)該約束,INSERT INTO CHECKTABLE(pid,cname,age,sex) VALUES(1,NULL,12,1) 該SQL語句是起作用的。這是因?yàn)镹ULL值用在比較操作中時(shí),它被當(dāng)作UNKNOWN。因?yàn)閁NKNOWN不是FALSE,所以沒有違反檢查約束。因此,當(dāng)你編寫你的檢查約束時(shí),你需要對(duì)需要拒絕包含NULL值的地方很謹(jǐn)慎。上面的代碼應(yīng)該改為:
- ALTER TABLE CHECKTABLE
 - WITH NOCHECK ADD CONSTRAINT CK_CheckTable_Sex
 - CHECK (sex IN (0,1)),
 - CONSTRAINT CK_CheckTable_Sex
 - CHECK (cname IS NOT NULL AND cname IN ('zy','zs'));
 
結(jié)論
通過SQL Server使用檢查約束,你可以確保你的數(shù)據(jù)庫只包含通過了約束的數(shù)據(jù)。這使得你可以讓數(shù)據(jù)庫引擎控制你的數(shù)據(jù)驗(yàn)證。這么做將使得你的應(yīng)用程序不需要在每個(gè)你希望插入一條記錄或更新一條記錄到一個(gè)表中的地方都寫數(shù)據(jù)驗(yàn)證規(guī)則的代碼。檢查約束是執(zhí)行數(shù)據(jù)驗(yàn)證的一個(gè)簡潔方法。
【編輯推薦】
- SQL Server鏡像工作方式與實(shí)現(xiàn)方式
 - SQL Server所有表的列信息展示
 - 創(chuàng)建SQL Server全文檢索的2方案
 - 實(shí)現(xiàn)SQL Server 2000全文索引遷移步驟
 - SQL Server全文索引的實(shí)例演示
 















 
 
 
 
 
 
 