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