国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

使用檢查約束驗(yàn)證SQL Server中的數(shù)據(jù)

原創(chuàng)
企業(yè)動(dòng)態(tài) 數(shù)據(jù)庫運(yùn)維 SQL Server
構(gòu)建應(yīng)用程序最關(guān)鍵的目標(biāo)之一是確保所有進(jìn)入數(shù)據(jù)庫的數(shù)據(jù)都要符合你的業(yè)務(wù)規(guī)則,數(shù)據(jù)校驗(yàn)是應(yīng)用程序的關(guān)鍵部分,確保你的數(shù)據(jù)滿足業(yè)務(wù)分析師制定的需求。本文將給大家介紹如何使用檢查約束驗(yàn)證SQL Server中的數(shù)據(jù)。

【51CTO獨(dú)家特稿】有許多校驗(yàn)數(shù)據(jù)和業(yè)務(wù)規(guī)則是否匹配的方法,在應(yīng)用程序代碼中可以強(qiáng)制實(shí)施數(shù)據(jù)校驗(yàn),也可以由數(shù)據(jù)庫引擎執(zhí)行數(shù)據(jù)校驗(yàn)。根據(jù)校驗(yàn)的方法不同,規(guī)則需求將確定你的應(yīng)用程序該如何正確地以及該在哪里校驗(yàn)數(shù)據(jù),本文將向你介紹如何使用數(shù)據(jù)庫“檢查約束”校驗(yàn)SQLServer中的數(shù)據(jù)。

什么是檢查約束?

檢查約束是一個(gè)識(shí)別SQLServer表中每行可接受的列值的規(guī)則,檢查約束幫助實(shí)施域的完整性,域完整性定義了數(shù)據(jù)庫表中列的有效值,檢查

約束可以驗(yàn)證單列的域完整性,也可以驗(yàn)證多列的域完整性,在單個(gè)列上可以有多個(gè)檢查約束,如果插入或更新的數(shù)據(jù)違反了檢查約束,數(shù)據(jù)

庫引擎將暫時(shí)停止INSERT和UPDATE操作。

檢查約束由邏輯表達(dá)式構(gòu)成,邏輯表達(dá)式可能是單個(gè)表達(dá)式,如“Salary<200000.00”,也可能是多個(gè)表達(dá)式,如“RentalDate>GETDATE

()andRentalDate

中的數(shù)據(jù),檢查約束是基于列的,因此,即便表中某列的檢查約束沒有通過,也不會(huì)影響到表中其它列的INSERT和UPDATE操作,檢查約束可以在列級(jí)創(chuàng)建,也可以在表級(jí)創(chuàng)建。

在CREATETABLE語句中創(chuàng)建檢查約束

創(chuàng)建檢查約束的一個(gè)方法就是在創(chuàng)建表的時(shí)候創(chuàng)建,下面是一個(gè)簡單的CREATETABLE腳本,它包含了創(chuàng)建一個(gè)檢查約束的代碼:

CREATETABLEdbo.Payroll

(

IDintPRIMARYKEY,

PositionIDINT,

SalaryTypenvarchar(10),

Salarydecimal(9,2)

CHECK(Salary<150000.00)

);

這里的CHECK子句關(guān)聯(lián)了Salary列,這是一個(gè)列級(jí)的約束,如果你創(chuàng)建了一個(gè)列級(jí)約束,你只能在檢查約束的邏輯表達(dá)式中使用列名,這里的檢查約束列就只允許Salary列的值小于150000。創(chuàng)建這個(gè)表時(shí)也會(huì)創(chuàng)建CHECK約束,約束名由系統(tǒng)自動(dòng)生成,如果你想在CREATETABLE操作時(shí)命名你的檢查約束,代碼就可以變成下面這樣:

CREATETABLEdbo.Payroll

(

IDintPRIMARYKEY,

PositionIDINT,

SalaryTypenvarchar(10),

Salarydecimal(9,2)

CONSTRAINTCK_Payroll_SalaryCHECK(Salary<150000.00)

);

這里我將檢查約束命名為CK_Payroll_Salary了。

上面的例子都僅在單個(gè)列上創(chuàng)建了檢查約束,而且也只有一個(gè)條件,其實(shí)檢查約束表達(dá)式可以包括多個(gè)條件,下面就是一個(gè)包含多個(gè)條件的檢查約束:

CREATETABLEdbo.Payroll

(

IDintPRIMARYKEY,

PositionIDINT,

SalaryTypenvarchar(10),

Salarydecimal(9,2)

CONSTRAINTCK_Payroll_Salary

CHECK(Salary>10.00andSalary<150000.00)

);

如果要讓SQLServer拒絕一條記錄,那在檢查約束邏輯表達(dá)式的最終輸出中需要計(jì)算為FALSE,因此,在這個(gè)例子中,檢查約束會(huì)驗(yàn)證Salary大于10且小于150000,這兩個(gè)條件中任意一個(gè)檢查結(jié)果返回FLASE,都會(huì)直接拒絕Payroll表中對(duì)行的INSERT或UPDATE請(qǐng)求,提示也會(huì)顯示一條錯(cuò)誤消息。

如果你想創(chuàng)建一個(gè)表級(jí)檢查約束,你可以使用下面的代碼:

CREATETABLEdbo.Payroll

(

IDintPRIMARYKEY,

PositionIDINT,

Salarydecimal(9,2),

SalaryTypenvarchar(10),

CHECK(Salary>10.00andSalary<150000.00)

);

在這里我創(chuàng)建了單個(gè)表級(jí)約束,檢查Salary列,但可以使用表中的任意列,因?yàn)檫@是一個(gè)表級(jí)檢查,注意CHECK子句將會(huì)引起SQLServer生成一個(gè)檢查約束名,因?yàn)槲覜]有手動(dòng)為其命名。

在現(xiàn)有表上創(chuàng)建檢查約束

有時(shí),在你設(shè)計(jì)和創(chuàng)建好表后,你可能想要在表上放一個(gè)檢查約束,你可以使用ALTERTABLE語句來實(shí)現(xiàn),下面是一個(gè)例子:

ALTERTABLEdbo.Payroll

WITHNOCHECKADDCONSTRAINTCK_Payroll_SalaryType

CHECK(SalaryTypein('Hourly','Monthly','Annual'));

我在這里的創(chuàng)建檢查約束將會(huì)檢查Payroll表中SalaryType列的值為“Hourly”,“Monthly”或“Annual”的所有記錄,我還給這個(gè)檢查約束起了一個(gè)名字,叫做“CK_Payroll_SalaryType”。

你也可以在一個(gè)ALTERTABLE語句中給表添加多個(gè)檢查約束,下面就是這樣一個(gè)例子:

ALTERTABLEdbo.Payroll

WITHNOCHECKADDCONSTRAINTCK_Payroll_SalaryType

CHECK(SalaryTypein('Hourly','Monthly','Annual')),

CONSTRAINTCK_Payroll_Salary

CHECK(Salary>10.00andSalary<150000.00);

在這里我在一條ADDCONSTRAINT子句中為SalaryType和Salary這兩列同時(shí)增加了檢查約束。

創(chuàng)建多列約束

不用在每個(gè)列上都創(chuàng)建約束,相反,可以在多個(gè)列上同時(shí)創(chuàng)建一個(gè)約束來檢查這些列的值,例如,如果我想創(chuàng)建單個(gè)約束來檢查Salary和SalaryType,那我可能使用如下的代碼:

ALTERTABLEdbo.PayrollWITHNOCHECK

ADDCONSTRAINTCK_Payroll_Salary_N_SalaryType

CHECK(SalaryTypein('Hourly','Monthly','Annual')

andSalary>10.00andSalary<150000.00);

這個(gè)約束和前面的兩個(gè)約束完成的事情是一樣的,但你要記住,這樣做有一個(gè)不好的后果,那就是最終在理解究竟是SalaryType列,還是Salary列,或者這兩列違反了你的檢查約束時(shí)可能比較困難。

這樣做之后還有一個(gè)讓人煩惱的是不止使用一列來判斷某個(gè)特定列的值是否有效,例如,假設(shè)我想要確保在輸入HourlySalaryType時(shí),我想要Salary小于100,或者在輸入MonthlySalaryType時(shí),Salary小于10000,當(dāng)輸入AnnualSalaryType時(shí),Salary合計(jì)是準(zhǔn)確的。為了實(shí)現(xiàn)這個(gè)約束條件,我使用下面的ADDCONSTRAINT子句:

ALTERTABLEdbo.PayrollWITHNOCHECK

ADDCONSTRAINTCK_Payroll_SalaryType_Based_On_Salary

CHECK((SalaryType='Hourly'andSalary<100.00)or

(SalaryType='Monthly'andSalary<10000.00)or

(SalaryType='Annual'));

在這里我將多列條件集中在一起了,又用or條件將它們進(jìn)行分離,這樣我的檢查約束就可以驗(yàn)證每個(gè)不同的SalaryType的Salary值了。

理解遇到空值時(shí)會(huì)發(fā)生什么

回顧一下我在本文的第一小節(jié)“什么是檢查約束”中講到的“當(dāng)檢查約束的條件表達(dá)式返回一個(gè)FALSE值時(shí),記錄不能INSERT和UPDATE”,因?yàn)槿绱耍罩悼赡茏屵M(jìn)入數(shù)據(jù)庫的數(shù)據(jù)并不符合你的要求。例如,假設(shè)在payroll表上只有一個(gè)CK_Paryroll_SalaryType檢查約束,只需要刷新檢查約束所在內(nèi)存即可:

ALTERTABLEdbo.Payroll

WITHNOCHECKADDCONSTRAINTCK_Payroll_SalaryType

CHECK(SalaryTypein('Hourly','Monthly','Annual'));

現(xiàn)在,如果你執(zhí)行下面的INSERT語句:

INSERTINTOdbo.Payrollvalues(1,1,'Hourly',25.00);

INSERTINTOdbo.Payrollvalues(2,2,NULL,25.00);

INSERTINTOdbo.Payrollvalues(3,3,'Horly',25.00);

你認(rèn)為將會(huì)發(fā)生什么?只有第一條INSERT語句會(huì)起作用嗎?第二條和第三條INSERT將會(huì)怎么樣?它們都會(huì)違反CK_Payroll_SalaryType嗎?結(jié)果是只有第三條INSERT語句會(huì)失敗,它之所以失敗是因?yàn)镾alaryType被打亂了,不再僅僅是“Hourly”,“Monthly”或“Annual”了,那為什么第二個(gè)INSERT語句沒有返回FALSE呢?很明顯,NULL(空值)也不是有效的SalaryType,第二條INSERT語句能夠工作的原因是它運(yùn)行時(shí)CK_Payroll_SalaryType約束沒有返回FALSE值,所以數(shù)據(jù)庫引擎就插入了第二條記錄。

為什么會(huì)這樣呢?因?yàn)镹ULL(空值)在比較操作中時(shí)會(huì)返回UNKNOWN,因?yàn)閁NKNOWN并不等價(jià)于FLASE,故沒有違反檢查約束。因此,你在寫檢查約束時(shí)要當(dāng)心,你可能想要排除掉包含NULL(空值)的值。上面的例子如果想要排除掉NULL(空值),那代碼要做如下的改動(dòng):

ALTERTABLEdbo.Payroll

WITHNOCHECKADDCONSTRAINTCK_Payroll_SalaryType

CHECK((SalaryTypein('Hourly','Monthly','Annual'))

andSalaryTypeisnotNULL);

另一個(gè)選擇是將SalaryType列設(shè)置為一個(gè)NOTNULL字段,這樣之后就不用再創(chuàng)建一個(gè)檢查約束了,但你會(huì)獲得一個(gè)不能向表中插入NULL值的錯(cuò)誤消息。

通過檢查約束進(jìn)行數(shù)據(jù)驗(yàn)證

使用檢查約束后,可以確保你的數(shù)據(jù)庫只包括通過了檢查的數(shù)據(jù),這樣允許你讓數(shù)據(jù)庫引擎控制你的數(shù)據(jù)有效性,這樣做之后,你的應(yīng)用程序就不用再進(jìn)行數(shù)據(jù)驗(yàn)證了,否則程序代碼中到處都穿插有數(shù)據(jù)校驗(yàn)的腳本,通過這種方法使數(shù)據(jù)驗(yàn)證工作更輕松,更簡潔。

責(zé)任編輯:彭凡 來源: 51CTO
相關(guān)推薦

2010-07-22 16:21:33

SQL Server使

2020-11-18 09:24:18

MySQL數(shù)據(jù)庫技術(shù)

2010-11-12 14:55:59

Sql Server檢

2009-04-16 17:44:31

2010-10-22 10:27:41

SQL Server驗(yàn)

2010-09-08 13:21:19

SQL刪除約束

2010-11-12 15:04:30

SQL Server缺

2010-07-06 16:52:17

SQL Server創(chuàng)

2010-09-24 17:08:03

SQL Server唯

2011-08-04 16:20:39

SQLServer數(shù)據(jù)索引碎片DBCC ShowCo

2010-06-17 16:59:51

SQL Server身

2010-11-12 15:28:59

sql server默

2010-11-10 11:37:29

SQL Server刪

2010-09-25 13:16:51

SQL Server外

2010-09-03 13:51:10

SQL刪除約束

2010-06-17 17:50:31

SQL Server外

2013-07-30 16:54:32

2011-08-22 13:28:56

FOR XMLSQL Server

2010-10-22 10:16:04

SQL Server驗(yàn)

2010-09-27 13:30:00

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

日本特黄久久久高潮| 韩国毛片一区二区三区| 久久精品人人做人人爽| 成人免费网站在线观看视频| 亚洲大片免费看| 亚洲四虎av| 欧美精彩视频一区二区三区| 农民人伦一区二区三区| 国产麻豆91精品| 国产日韩视频在线播放| 久久精品123| 韩国一区二区三区美女美女秀 | 国内精品视频| 精品中文视频在线| 日本孕妇大胆孕交无码| 7777精品伊人久久久大香线蕉 | а√天堂资源地址在线下载| 欧美日韩高清一区二区| 99se视频在线观看| 欧美片网站yy| 色婷婷av在线| 精品亚洲永久免费精品 | 岛国av一区| 欧美日本高清一区| 丁香5月婷婷久久| 97香蕉超级碰碰久久免费软件| 成人三级av在线| 97视频免费看| 韩日一区二区三区| 亚洲伊人久久大香线蕉av| 亚洲国产综合在线看不卡| 久久久精品有限公司| 日韩精品一区第一页| 中国一级黄色录像| 久久―日本道色综合久久| 97国产精东麻豆人妻电影| 2020国产精品自拍| 色av一区二区三区| 欧美午夜精品久久久久久超碰| 成人高清在线| 亚洲国产三级网| 九色精品蝌蚪| 成人精品网站在线观看| 国产亚洲毛片在线| 精品国产一区二区三区无码| 久久久精品国产免费观看同学| 日本五十路在线| 宅男噜噜噜66一区二区66| 成人黄色免费短视频| 欧美性视频精品| 国产欧美精品久久| 国产特级黄色大片| 夜夜精品视频一区二区| 大地资源网3页在线观看| 日韩最新av在线| 国产精品一在线观看| 免费久久一级欧美特大黄| 不卡在线观看av| 中文字幕在线二区| 精品一区二区电影| jlzzjlzz亚洲女人| 992tv成人免费观看| 亚洲欧美成人一区二区三区| 91高清在线观看视频| 欧美裸身视频免费观看| 激情综合自拍| 欧美xxxxx在线视频| 欧美日韩在线直播| 伊人久久影院| 视频一区在线免费观看| 成人欧美一区二区三区黑人麻豆| 国产精品久久麻豆| 日本亚洲欧洲色| 国内精品久久久久影院薰衣草| 成人福利免费网站| 亚洲黄色有码视频| 日韩欧美不卡| 欧美网站免费观看| 欧美一区二区三区公司| 免费成人av| 岛国大片在线播放| 欧美网站一区二区| 69精品国产久热在线观看| 少妇精品久久久久久久久久| 亚洲综合激情网| 成人黄色在线| 国产综合精品一区二区三区| 国产日产亚洲精品系列| 日本大片在线播放| 成人午夜激情网| 中文字幕欧美激情一区| 在线精品亚洲欧美日韩国产| 国产精品视频500部| 亚洲精品你懂的| 亚州精品国产| 伊人色综合影院| 色综合天天综合| 波多野结衣一区二区三区免费视频| 欧美综合77777色婷婷| 亚洲成av人片一区二区三区| 一区二区中文字幕在线观看| 妺妺窝人体色www看人体| 欧美一级黄色片| 欧美韩日精品| 最新中文字幕在线视频| 久久男人av资源网站| 精品亚洲国内自在自线福利| 免费高清在线观看| 9a蜜桃久久久久久免费| 亚洲一区二区偷拍精品| 日韩三级不卡| www.99热这里只有精品| 国产亚洲精品久久| 国产一本一道久久香蕉| 中文字幕免费高清电视剧网站在线观看| 成人激情综合网| 午夜久久福利影院| 欧美中文一区二区| 3dmax动漫人物在线看| 欧美在线欧美在线| 国产精品伦一区二区三级视频| 国产色99精品9i| 日韩avxxx| 日韩在线小视频| 高清shemale亚洲人妖| 成人性生活视频| 欧美美女黄色网| 亚洲欧美激情另类校园| 国产一区在线视频| 播放一区二区| 大陆极品少妇内射aaaaa| 久久九九亚洲综合| 久久久高清一区二区三区| av日韩久久| 免费黄色一级网站| 欧美亚洲视频一区二区| 一区二区视频免费在线观看| 欧美激情成人| jizz亚洲| 色播五月综合| 亚洲欧美激情视频| 2021国产精品久久精品| 日韩美脚连裤袜丝袜在线| 91在线九色porny| 国产精选一区二区| 日韩视频免费直播| 国产成人综合网| 亚洲国产中文在线| 国模大尺度私拍在线视频| 国产精品日韩在线一区| 欧美羞羞免费网站| 日韩不卡一区二区| 久久久加勒比| 国产一级黄色片免费| y111111国产精品久久婷婷| 精品嫩草影院久久| 99久久亚洲一区二区三区青草| 久久丝袜视频| 你懂的视频在线免费| 亚洲午夜精品福利| 久久久久国色av免费观看性色 | 天天操天天摸天天爽| 日本成人在线视频网址| 日韩欧美一区二区三区久久| 亚洲专区欧美专区| 日本精品网站| 国产网站观看9久| 91传媒视频免费| 亚洲国产精品热久久| 国产欧美一区二区精品性| 欧美1区2区| 国产精品传媒麻豆hd| 大地资源高清播放在线观看 | 午夜精品久久久久久久四虎美女版| 137大胆人体在线观看| www.激情网| 国产成人一区三区| 日韩美女视频在线| 国产亚洲人成网站| 日韩天天综合| 精品国产亚洲一区二区在线观看| 中文字幕视频在线| www亚洲国产| 国产极品精品在线观看| 日韩女优av电影| 国产三级精品在线| 亚洲高清av| 中文字幕亚洲在线观看| 日本激情在线观看| 超碰在线播放91| 欧美精品一区二区三区四区五区 | 99精品欧美一区二区三区| 亚洲欧美国产精品专区久久| 亚洲综合视频网| 国产激情91久久精品导航| 亚洲澳门在线| 亚洲天堂中文字幕在线观看| 丰满大乳少妇在线观看网站| igao视频网在线视频| 成人网站免费观看入口|