本文主要介紹sql的約束(sql語(yǔ)句0 ~ 100個(gè)約束),下面一起看看sql的約束(sql語(yǔ)句0 ~ 100個(gè)約束)相關(guān)資訊。
目錄1、約束1.1主鍵1.2外鍵1.3唯一約束1.4檢查約束2、索引3、觸發(fā)器4、數(shù)據(jù)庫(kù)安全5、總結(jié)本文介紹了sql涉及的幾個(gè)數(shù)據(jù)處理特性:約束、索引和觸發(fā)器。約束是實(shí)現(xiàn)引用完整性的重要部分,索引可以提高數(shù)據(jù)檢索的性能,觸發(fā)器可以用于執(zhí)行運(yùn)行前后的處理。
1.constrained sql在許多版本中得到了改進(jìn),已經(jīng)成為一種非常完美和強(qiáng)大的語(yǔ)言。許多強(qiáng)大的功能為用戶(hù)提供了高級(jí)的數(shù)據(jù)處理技術(shù),例如約束。
關(guān)聯(lián)表和參照完整性以前已經(jīng)討論過(guò)幾次了。如前所述,關(guān)系數(shù)據(jù)庫(kù)存儲(chǔ)分解到多個(gè)表中的數(shù)據(jù),每個(gè)表存儲(chǔ)相應(yīng)的數(shù)據(jù)。使用鍵建立從一個(gè)表到另一個(gè)表的引用[因此有了術(shù)語(yǔ)引用完整性]。
為了正確地設(shè)計(jì)關(guān)系數(shù)據(jù)庫(kù),我們需要一種方法來(lái)確保只有合法的數(shù)據(jù)入到表中。
例如,如果orders表存儲(chǔ)訂單信息,而orderitems表存儲(chǔ)訂單詳細(xì)信息,則應(yīng)該確保orderitems中引用的任何訂單id都存在于訂單中。
同樣,orders表中引用的任何客戶(hù)都必須存在于customers表中。
雖然您可以在插入新行時(shí)進(jìn)行檢查(在另一個(gè)表上執(zhí)行select以確保所有值都合法并且存在),但出于以下原因,最好不要這樣做。
如果數(shù)據(jù)庫(kù)完整性規(guī)則在客戶(hù)端級(jí)別實(shí)現(xiàn),每個(gè)客戶(hù)端都將實(shí)現(xiàn)這些規(guī)則,而有些客戶(hù)端肯定不會(huì)實(shí)現(xiàn)這些規(guī)則。在執(zhí)行更新和刪除操作時(shí),也必須實(shí)現(xiàn)這些規(guī)則。執(zhí)行客戶(hù)端檢查非常耗時(shí),dbms可以相對(duì)高效地執(zhí)行這些檢查。約束(約束)
控制如何插入或處理數(shù)據(jù)庫(kù)數(shù)據(jù)的規(guī)則。
dbms通過(guò)對(duì)數(shù)據(jù)庫(kù)表施加約束來(lái)加強(qiáng)參照完整性。
大多數(shù)約束是在表定義中定義的,如如何使用sql create table、使用create table或alter table語(yǔ)句創(chuàng)建新表中所述。
注意:特定數(shù)據(jù)庫(kù)管理系統(tǒng)的約束
有幾種不同類(lèi)型的約束,每個(gè)dbms都提供自己的支持。
因此,這里給出的例子在不同的dbms上可能會(huì)有不同的反應(yīng)。在進(jìn)行實(shí)驗(yàn)之前,請(qǐng)參考特定的dbms文檔。
1.1主鍵我們?cè)趯W(xué)習(xí)sql之前需要知道的基礎(chǔ)知識(shí)已經(jīng)簡(jiǎn)單提到了。
主鍵是一種特殊的約束,用于確保一列(或一組列)中的值是唯一的,并且永遠(yuǎn)不會(huì)改變。
換句話(huà)說(shuō),表中有一個(gè)一列(或多列)的值唯一標(biāo)識(shí)表中的每一行。這有助于直接或交互處理表中的行。
如果沒(méi)有主鍵,很難在不影響其他行的情況下安全地更新或刪除特定的行。
只要滿(mǎn)足下列條件,表中的任何列都可以用作主鍵。
任何兩行的主鍵值都是不同的。每行都有一個(gè)主鍵值(即列中不允許有空值)。包含主鍵值的列永遠(yuǎn)不會(huì)被修改或更新。(大多數(shù)數(shù)據(jù)庫(kù)管理系統(tǒng)不 不允許這樣做,但是如果你正在使用的數(shù)據(jù)庫(kù)管理系統(tǒng)允許,那么,不要 t!)主鍵值不能重復(fù)使用。如果從表中刪除一行,它的主鍵值不會(huì)分配給新行。定義主鍵的一種方法是創(chuàng)建主鍵,如下所示。
創(chuàng)建表供應(yīng)商(vend_id char(10) not null主鍵,vend_name char(50) not null,vend_address char(50) null,vend_city char(50) null,vend_state char(5) null,vend_zip char(10) null,vend _ country char(50)null);在本例中,關(guān)鍵字primary key被添加到表的vend_id列定義中,使其成為主鍵。
alter table vendorsadd約束主鍵(vend _ id);這里將同一列定義為主鍵,但是使用了約束語(yǔ)法。該語(yǔ)法也可用于create table和alter table語(yǔ)句。
描述:sqlite中的密鑰
sqlite不允許使用alter table來(lái)定義鍵,并要求在初始create table語(yǔ)句中定義鍵。
1.2外鍵外鍵是表中的一列,其值必須列在另一個(gè)表的主鍵中。外鍵是確保引用完整性的一個(gè)極其重要的部分。讓 讓我們舉個(gè)例子來(lái)理解外鍵。
orders表包含作為一行輸入到系統(tǒng)中的每個(gè)訂單。
客戶(hù)信息存儲(chǔ)在customers表中。orders表中的訂單通過(guò)客戶(hù)id與customers表中的特定行相關(guān)聯(lián)。
客戶(hù)id是customers表的主鍵,每個(gè)客戶(hù)都有一個(gè)唯一的id。訂單編號(hào)是訂單表的主鍵,每個(gè)訂單都有一個(gè)唯一的訂單編號(hào)。
orders表中客戶(hù)id列的值不一定是唯一的。
如果客戶(hù)有多個(gè)訂單,則有多個(gè)行具有相同的客戶(hù)id(盡管每個(gè)訂單有不同的訂單號(hào))。同時(shí),orders表中客戶(hù)id列的合法值就是customers表中的客戶(hù)id。
這就是外鍵的作用。在本例中,外鍵是在訂單的客戶(hù)id列上定義的,因此該列只能接受客戶(hù)表的主鍵值。
這里 如何定義這個(gè)外鍵。
創(chuàng)建訂單表(order_num integer not null主鍵,order_date datetime not null,cust_id char(10) not null引用客戶(hù)(cust _ id));表定義使用references關(guān)鍵字,這意味著cust_id中的任何值都必須是customers表的cust_id中的值。
在alter table語(yǔ)句中使用約束語(yǔ)法也可以完成同樣的工作:
alter table orders add constraint foreign key(cust _ id)引用customers(cust _ id);提示:外鍵有助于防止意外刪除。
如如何使用sql update和delete語(yǔ)句更新或刪除表數(shù)據(jù)中所述,外鍵除了有助于確保引用完整性之外,還有另一個(gè)重要功能。
定義外鍵后,dbms不允許刪除與另一個(gè)表中的行相關(guān)聯(lián)的行。
例如,不能刪除與訂單關(guān)聯(lián)的客戶(hù)。刪除客戶(hù)的唯一方法是首先刪除相關(guān)訂單(這意味著刪除相關(guān)訂單項(xiàng)目)。因?yàn)樾枰幌盗械膭h除,所以使用外鍵可以防止數(shù)據(jù)的意外刪除。
有些數(shù)據(jù)庫(kù)管理系統(tǒng)支持一種稱(chēng)為級(jí)聯(lián)刪除的功能。如果啟用,此功能將在從表中刪除行時(shí)刪除所有相關(guān)數(shù)據(jù)。
例如,如果啟用了級(jí)聯(lián)刪除,并且從客戶(hù)表中刪除了一個(gè)客戶(hù),則任何關(guān)聯(lián)的訂單行也會(huì)被自動(dòng)刪除。
1.3唯一約束唯一約束用于確保一列(或一組列)中的數(shù)據(jù)是唯一的。它們類(lèi)似于主鍵,但有以下重要區(qū)別。
表可以包含多個(gè)唯一約束,但每個(gè)表只允許有一個(gè)主鍵。唯一約束列可以包含空值??梢孕薷幕蚋挛ㄒ患s束列。唯一約束列的值可以重復(fù)使用。與主鍵不同,唯一約束不能用于定義外鍵。employees表是使用約束的一個(gè)例子。每個(gè)雇員都有一個(gè)獨(dú)特的社會(huì)安全號(hào)碼,但我們沒(méi)有。;我不想用它作為主鍵,因?yàn)樗L(zhǎng)了(我們也不想用它 我不想寫(xiě)這封信。興趣好用)。
因此,每個(gè)雇員除了他的社會(huì)保險(xiǎn)號(hào)之外,還有一個(gè)唯一的雇員id(主鍵)。
員工id是主鍵,可以確定它是唯一的。您可能還希望dbms確保每個(gè)社會(huì)保險(xiǎn)號(hào)是唯一的(以確保輸入錯(cuò)誤不會(huì)導(dǎo)致他人使用 s數(shù)字)。您可以通過(guò)在社會(huì)保險(xiǎn)號(hào)列上定義唯一約束來(lái)實(shí)現(xiàn)這一點(diǎn)。
唯一約束的語(yǔ)法類(lèi)似于其他約束的語(yǔ)法。可以使用unique關(guān)鍵字或單獨(dú)的約束在表定義中定義unique約束。
1.4檢查約束檢查約束用于確保一列(或一組列)中的數(shù)據(jù)滿(mǎn)足一組指定的條件。檢查約束的常見(jiàn)用法如下。
檢查最小值或最大值。例如,禁止訂購(gòu)0個(gè)項(xiàng)目(即使0是合法數(shù)字)。指定范圍。例如,交貨日期保證大于或等于今天 的日期,但不遲于一年后的今天。僅允許某些值。例如,在性別字段中只允許m或f。換句話(huà)說(shuō),學(xué)習(xí)sql之前需要知道的基礎(chǔ)知識(shí)介紹了數(shù)據(jù)類(lèi)型,這些數(shù)據(jù)類(lèi)型限制了一個(gè)列中可以保存的數(shù)據(jù)類(lèi)型。
check約束對(duì)數(shù)據(jù)類(lèi)型施加了進(jìn)一步的限制,這對(duì)于確保插入到數(shù)據(jù)庫(kù)中的數(shù)據(jù)正是您想要的非常重要。
不需要依賴(lài)客戶(hù)端應(yīng)用程序或用戶(hù)來(lái)確保正確獲取數(shù)據(jù),dbms本身會(huì)拒絕任何無(wú)效數(shù)據(jù)。
以下示例對(duì)orderitems表施加了check約束,以確保所有項(xiàng)目的數(shù)量都大于0。
創(chuàng)建表orderitems(order _ num integer not null,order_item integer not null,prod_id char(10) not null,quantity integer not null check(數(shù)量0),item _ price money not null);使用此約束,將檢查任何插入(或更新)的行,以確保數(shù)量大于0。
檢查名為gender的列是否只包含m或f,您可以編寫(xiě)以下alter table語(yǔ)句:
添加約束檢查(性別相似 [mf] ;);提示:用戶(hù)定義的數(shù)據(jù)類(lèi)型
一些數(shù)據(jù)庫(kù)管理系統(tǒng)允許用戶(hù)定義他們自己的數(shù)據(jù)類(lèi)型。
它們是定義檢查約束(或其他約束)的基本簡(jiǎn)單數(shù)據(jù)類(lèi)型。
例如,您可以定義自己的名為gender的數(shù)據(jù)類(lèi)型,這是一種單字符文本數(shù)據(jù)類(lèi)型,帶有一個(gè)check約束,將其值限制為m或f(未知值可能允許null)。
然后,你可以把該數(shù)據(jù)類(lèi)型用于表定義。自定義數(shù)據(jù)類(lèi)型的優(yōu)點(diǎn)在于,您只需應(yīng)用一次約束(在數(shù)據(jù)類(lèi)型定義中),每當(dāng)使用該數(shù)據(jù)類(lèi)型時(shí),這些約束就會(huì)自動(dòng)應(yīng)用。
請(qǐng)查閱相應(yīng)的dbms文檔,看看它是否支持自定義數(shù)據(jù)類(lèi)型。
第二,索引索引用于對(duì)數(shù)據(jù)進(jìn)行排序,以加快搜索和排序操作。想象一下一本書(shū)后面的索引,可以幫助你理解數(shù)據(jù)庫(kù)的索引。
如果你想找出所有的單詞 數(shù)據(jù)類(lèi)型 在書(shū)中,簡(jiǎn)單的方法是從第一頁(yè)開(kāi)始,瀏覽每一行。雖然這樣可以完成任務(wù),但顯然不是好辦法。
瀏覽幾頁(yè)也許可以,但這樣瀏覽整本書(shū)不可行。隨著要搜索的頁(yè)面數(shù)量的增加,查找所需單詞的時(shí)間也會(huì)增加。
這就是為什么書(shū)應(yīng)該被索引。索引按字母順序列出單詞及其在書(shū)中的位置。搜索單詞 數(shù)據(jù)類(lèi)型 ,您可以在索引中找到該單詞,并確定它出現(xiàn)在哪些頁(yè)面中。然后翻到這幾頁(yè),找到單詞 數(shù)據(jù)類(lèi)型 。
索引的作用是什么?it 這很簡(jiǎn)單。;這是正確的種類(lèi)。找出書(shū)中單詞的難度不在于必須進(jìn)行多少次搜索,而在于書(shū)中的內(nèi)容沒(méi)有按單詞排序。如果一本書(shū)的內(nèi)容像字典一樣排序,索引是不必要的(所以字典沒(méi)有索引)。
數(shù)據(jù)庫(kù)索引也是如此。主鍵數(shù)據(jù)總是排序的,這是dbms的工作。因此,通過(guò)主鍵檢索特定行始終是一種快速有效的操作。
但是,搜索其他列中的值通常效率很低。
例如,如果您想搜索居住在某個(gè)州的客戶(hù),該怎么辦?因?yàn)楸頂?shù)據(jù)不是按州排序的,所以dbms必須讀取表中的所有行(從第一行開(kāi)始)以查看它們是否匹配。it 這就像在沒(méi)有索引的書(shū)里找單詞一樣。
解決方法是使用索引。您可以在一列或多列上定義一個(gè)索引,這樣dbms就可以保存其內(nèi)容的有序列表。
定義索引后,dbms以類(lèi)似于書(shū)籍索引的使用它。dbms搜索排序的索引,找到匹配的位置,然后檢索這些行。
在開(kāi)始創(chuàng)建索引之前,您應(yīng)該記住以下幾點(diǎn)。
索引提高了檢索操作的性能,但是降低了數(shù)據(jù)插入、修改和刪除的性能。當(dāng)執(zhí)行這些操作時(shí),dbms必須動(dòng)態(tài)更新索引。索引數(shù)據(jù)可能會(huì)占用大量存儲(chǔ)空間。并非所有數(shù)據(jù)都適合索引。值很少的數(shù)據(jù)(如state)從索引中獲得的好處不如具有更多可能值的數(shù)據(jù)(如surname或first name)多。索引用于數(shù)據(jù)過(guò)濾和數(shù)據(jù)排序。如果您經(jīng)常按照一定的順序?qū)?shù)據(jù)進(jìn)行排序,它可能適合于索引。您可以在一個(gè)索引中定義多個(gè)列(例如,州和城市)。這種索引只在按州和城市排序時(shí)有用。如果你想按城市排序,這個(gè)索引就沒(méi)用了。對(duì)于應(yīng)該索引什么以及何時(shí)索引沒(méi)有嚴(yán)格的規(guī)則。大多數(shù)數(shù)據(jù)庫(kù)管理系統(tǒng)提供可用于確定索引效率的實(shí)用程序,應(yīng)該經(jīng)常使用。
索引是用create index語(yǔ)句創(chuàng)建的(創(chuàng)建索引的語(yǔ)句因dbms而異)。以下語(yǔ)句在products表的product列上創(chuàng)建一個(gè)簡(jiǎn)單索引。
在產(chǎn)品(產(chǎn)品名稱(chēng))上創(chuàng)建索引產(chǎn)品名稱(chēng);索引必須唯一命名。這里的索引名prod_name_ind是在關(guān)鍵字create index之后定義的。on用于指定要索引的表,索引中包含的列(本例中只有一列)在表名后面的括號(hào)中給出。
提示:查看索引。
索引的效率隨著表數(shù)據(jù)的增加或變化而變化。許多數(shù)據(jù)庫(kù)管理員發(fā)現(xiàn),過(guò)去創(chuàng)建的理想索引經(jīng)過(guò)幾個(gè)月的數(shù)據(jù)處理后可能并不理想。
最好定期檢查指數(shù),并根據(jù)需要進(jìn)行調(diào)整。
第三,觸發(fā)器trigger是一個(gè)特殊的存儲(chǔ)過(guò)程,當(dāng)特定的數(shù)據(jù)庫(kù)活動(dòng)發(fā)生時(shí),它會(huì)自動(dòng)執(zhí)行。觸發(fā)器可以與特定表上的插入、更新和刪除操作(或組合)相關(guān)聯(lián)。
與只存儲(chǔ)sql語(yǔ)句的存儲(chǔ)過(guò)程不同,觸發(fā)器與單個(gè)表相關(guān)聯(lián)。
只有在orders表中插入一行時(shí),才會(huì)執(zhí)行與orders表上的insert操作相關(guān)聯(lián)的觸發(fā)器。
類(lèi)似地,只有當(dāng)customers表上的insert和update操作出現(xiàn)在表上時(shí),才會(huì)執(zhí)行這些操作的觸發(fā)器。
觸發(fā)器內(nèi)的代碼可以訪(fǎng)問(wèn)以下數(shù)據(jù):
插入操作中的所有新數(shù)據(jù);更新操作中的所有新舊數(shù)據(jù);刪除操作中刪除的數(shù)據(jù)。根據(jù)使用的dbms,觸發(fā)器可以在執(zhí)行特定操作之前或之后執(zhí)行。
以下是觸發(fā)器的一些常見(jiàn)用法。
確保數(shù)據(jù)一致性。例如,在插入或更新操作中,將所有狀態(tài)名轉(zhuǎn)換為大寫(xiě)?;谝粋€(gè)表中的更改在其他表上執(zhí)行活動(dòng)。例如,每次更新或刪除一行時(shí),將審計(jì)跟蹤記錄寫(xiě)入日志表。根據(jù)需要執(zhí)行附加驗(yàn)證并回滾數(shù)據(jù)。例如,確??蛻?hù) 的可用資金不超過(guò)限制,如果超過(guò)限制,則阻止插入。計(jì)算計(jì)算列的值或更新時(shí)間戳。讀者可能已經(jīng)注意到,不同dbms的觸發(fā)器創(chuàng)建語(yǔ)法有很大不同。有關(guān)更多詳細(xì)信息,請(qǐng)參考相應(yīng)的文檔。
以下示例創(chuàng)建一個(gè)觸發(fā)器,該觸發(fā)器將customers表中的cust_state列轉(zhuǎn)換為大寫(xiě),以用于所有插入和更新操作。
這是此示例的sql server版本。
一個(gè)函數(shù)e觸發(fā)器customer _ state on customers for insert,updateas update customers set cust _ state = upper(cust _ state)其中customers . cust _ id = inserted . cust _ id;這是此示例的oracle和postgresql版本:
create trigger customer _ state after insert或updatefor每行begin update customers set cust _ state = upper(cust _ state)其中customers . cust _ id = : old . cust _ idend;提示:約束比觸發(fā)器更快。
一般來(lái)說(shuō),約束的處理速度比觸發(fā)器快,所以應(yīng)該盡可能地使用約束。
4.數(shù)據(jù)庫(kù)安全性對(duì)于一個(gè)組織來(lái)說(shuō),沒(méi)有什么比數(shù)據(jù)更重要了,因此應(yīng)該保護(hù)這些數(shù)據(jù)不被或隨意瀏覽。
當(dāng)然,需要訪(fǎng)問(wèn)數(shù)據(jù)的用戶(hù)也必須能夠訪(fǎng)問(wèn)數(shù)據(jù),因此大多數(shù)dbms都為管理員提供了管理機(jī)制來(lái)授權(quán)或限制對(duì)數(shù)據(jù)的訪(fǎng)問(wèn)。
任何安全系統(tǒng)的基礎(chǔ)都是用戶(hù)授權(quán)和身份確認(rèn)。這是一個(gè)用戶(hù)被確認(rèn),保證是授權(quán)用戶(hù),并被允許執(zhí)行他想要執(zhí)行的操作的過(guò)程。
有些dbms使用操作系統(tǒng)的安全措施,有些維護(hù)自己的用戶(hù)和密碼列表,有些使用外部目錄服務(wù)服務(wù)器。
一般來(lái)說(shuō),需要保護(hù)的操作有:
訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)管理功能(創(chuàng)建表格、更改或刪除現(xiàn)有表格等)。);對(duì)特定數(shù)據(jù)庫(kù)或表的訪(fǎng)問(wèn);訪(fǎng)問(wèn)類(lèi)型(只讀、對(duì)特定列的訪(fǎng)問(wèn)等。);只能通過(guò)視圖或存儲(chǔ)過(guò)程訪(fǎng)問(wèn)表;創(chuàng)建多級(jí)安全措施,允許基于多重登錄的訪(fǎng)問(wèn)和控制;限制管理用戶(hù)帳戶(hù)的能力。通過(guò)使用sql的grant和revoke語(yǔ)句來(lái)管理安全性,但是,大多數(shù)dbms提供了在內(nèi)部使用grant和revoke語(yǔ)句的交互式管理實(shí)用程序。
動(dòng)詞 (verb的縮寫(xiě))摘要本文介紹了如何使用sql的一些高級(jí)功能。約束是實(shí)現(xiàn)引用完整性的重要部分,索引可以提高數(shù)據(jù)檢索的性能,觸發(fā)器可用于執(zhí)行運(yùn)行前和運(yùn)行后處理,安全選項(xiàng)可用于管理數(shù)據(jù)訪(fǎng)問(wèn)。
不同的dbms可以以不同的形式提供這些功能。有關(guān)更多詳細(xì)信息,請(qǐng)參考特定的dbms文檔。
原始鏈接: www . developer strid . com/sql/sql-constraints-indexes-triggers/
(完)
標(biāo)簽:
索引數(shù)據(jù)
了解更多sql的約束(sql語(yǔ)句0 ~ 100個(gè)約束)相關(guān)內(nèi)容請(qǐng)關(guān)注本站點(diǎn)。