sql的約束(sql語句0~100約束)

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

影響施工進度的因素有哪些?又該怎么解決?
厚聲25121WF680JT4E今日行情、最新報價
冬季寒冷苗木如何防寒
貨款沒欠條怎么要回
華為nova5pro跟nova7哪個好(華為nova5 pro和華為nova7哪個更好)
臺式機機械硬盤供電線,請教硬盤電源線的接法
苗木病蟲害防治的五大方法
win7電腦如何查詢出廠序列號,怎樣查看自己電腦windows 7已經(jīng)激活的完整序列號
ecs和虛擬主機的區(qū)別
精靈樂章官網(wǎng)(精靈樂章升級路線)
十八禁 网站在线观看免费视频_2020av天堂网_一 级 黄 色 片免费网站_绝顶高潮合集Videos