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