新聞中心
SQL是一種強大的數(shù)據(jù)庫語言,通過SQL語言,可以在數(shù)據(jù)庫中定義各種規(guī)則、限制來維護數(shù)據(jù)的一致性、準確性和完整性等多個方面的要求。而完整性約束是SQL中的一種重要規(guī)則,本文將對SQL數(shù)據(jù)庫中的完整性約束做詳細的解釋和說明。

讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領域值得信任、有價值的長期合作伙伴,公司提供的服務項目有:域名與空間、虛擬空間、營銷軟件、網(wǎng)站建設、邵原網(wǎng)站維護、網(wǎng)站推廣。
1. 什么是完整性約束?
完整性約束(Integrity Constrnt)是SQL中的一種數(shù)據(jù)規(guī)則,用于限制數(shù)據(jù)庫中的數(shù)據(jù)格式、類型、內容等的有效性,從而保證數(shù)據(jù)的正確性、一致性和合理性。
2. 完整性約束的種類
在SQL中,完整性約束主要包括以下幾種類型:
2.1 非空約束(Not Null)
非空約束用于在數(shù)據(jù)庫中限制某個字段(列)的值不能為空值(null),如果在添加或更新數(shù)據(jù)時,該字段為空,則會引發(fā)錯誤。
2.2 唯一約束(Unique)
唯一約束用于在數(shù)據(jù)庫中限制某個字段(列)的值不能重復,即該字段的值在整個表中必須是唯一的。
2.3 主鍵約束(Primary Key)
主鍵約束用于在數(shù)據(jù)庫中限制某個字段(列)的值不能為null,并且該字段的值在整個表中必須唯一。而且,每個表中只能有一個主鍵。
2.4 外鍵約束(Foreign Key)
外鍵約束用于在數(shù)據(jù)庫中定義兩個表之間的關聯(lián)關系,如果兩個表之間存在外鍵關系,則刪除或修改父表中的數(shù)據(jù)時,必須要滿足某些條件,例如在主表中必須有匹配的子表記錄。
2.5 檢查約束(Check)
檢查約束用于在數(shù)據(jù)庫中限制某個字段(列)的值必須滿足特定條件,例如價格必須大于0,年齡必須在0~150之間等。
3. 完整性約束實例
下面是一些使用SQL完整性約束的實例:
— 創(chuàng)建一個學生表,用于演示各種完整性約束
CREATE TABLE students (
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
age INT CHECK(age>=0 AND age
gender ENUM(‘male’,’female’) NOT NULL,
phone VARCHAR(11) UNIQUE
);
3.1 非空約束(Not Null)
在上面的表中,名字(name)字段被定義為非空字段,確保在添加學生時該字段不能為null:
— 在學生表中添加一條記錄,缺少名字會報錯
INSERT INTO students (id, age, gender, phone) VALUES (1, 20, ‘male’, ‘135********’);
— 在學生表中添加一條記錄,名字不為空
INSERT INTO students (id, name, age, gender, phone) VALUES (2, ‘Tom’, 18, ‘male’, ‘152********’);
3.2 唯一約束(Unique)
在上面的表中,(phone)字段的值必須是唯一的,否則會報錯:
— 在學生表中添加一條記錄,已經(jīng)存在會報錯
INSERT INTO students (id, name, age, gender, phone) VALUES (3, ‘Lucy’, 19, ‘female’, ‘152********’);
— 在學生表中添加一條記錄,不重復
INSERT INTO students (id, name, age, gender, phone) VALUES (4, ‘Jack’, 20, ‘male’, ‘186********’);
3.3 主鍵約束(Primary Key)
在上面的表中,ID字段被定義為主鍵,確保在添加學生數(shù)據(jù)時,ID值不會重復,并且不能為空:
— 在學生表中插入一條記錄,ID值不為null且不重復
INSERT INTO students (id, name, age, gender, phone) VALUES (5, ‘Lisa’, 19, ‘female’, ‘135********’);
— 在學生表中插入一條記錄,ID值為null會報錯
INSERT INTO students (name, age, gender, phone) VALUES (‘Smith’, 22, ‘male’, ‘139********’);
3.4 外鍵約束(Foreign Key)
在SQL數(shù)據(jù)庫中,使用外鍵約束可以在兩個表之間建立關聯(lián)關系,并且確保刪除子表中的記錄不會導致主表中的數(shù)據(jù)丟失。例如下面例子中的兩個表格:
— 創(chuàng)建兩個表,一個班級表和一個學生表
CREATE TABLE classes (
class_id INT PRIMARY KEY,
class_name VARCHAR(20) NOT NULL
);
CREATE TABLE students (
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
age INT CHECK(age>=0 AND age
gender ENUM(‘male’,’female’) NOT NULL,
phone VARCHAR(11) UNIQUE,
class_id INT,
FOREIGN KEY (class_id) REFERENCES classes(class_id)
);
— 在學生表中插入數(shù)據(jù),確保外鍵約束關系存在
INSERT INTO classes(class_id, class_name) VALUES(1, ‘Class 1’);
INSERT INTO students(id, name, age, gender, phone, class_id) VALUES(1, ‘John’, 18, ‘male’, ‘135********’, 1);
3.5 檢查約束(Check)
使用檢查約束(Check)可以限制數(shù)據(jù)必須滿足特定條件,例如年齡必須在0~150之間等。下面是一個加了檢查約束的實例:
— 在學生表中加一個檢查約束,確保年齡必須在0~150之間
ALTER TABLE students ADD CHECK(age >=0 AND age
— 在學生表中插入一條數(shù)據(jù),該數(shù)據(jù)滿足約束條件
INSERT INTO students (id, name, age, gender, phone, class_id) VALUES (2, ‘Mike’, 20, ‘male’, ‘152********’, 1);
— 在學生表中插入一條數(shù)據(jù),該數(shù)據(jù)不滿足約束條件
INSERT INTO students (id, name, age, gender, phone, class_id) VALUES (3, ‘Kate’, -1, ‘female’, ‘139********’, 1);
4.
在SQL數(shù)據(jù)庫開發(fā)中,完整性約束是非常重要的一個概念。SQL中提供了多種約束類型,其中包括非空(NOT NULL)、唯一(UNIQUE)、主鍵(PRIMARY KEY)、外鍵(FOREIGN KEY)和檢查(CHECK)等。正確使用完整性約束可以有效的保證數(shù)據(jù)的一致性、準確性和完整性等多個方面的要求。同時,在開發(fā)中也需要考慮到約束的性能問題,如約束重復或失去了意義,需要及時的刪除或優(yōu)化。
成都網(wǎng)站建設公司-創(chuàng)新互聯(lián),建站經(jīng)驗豐富以策略為先導10多年以來專注數(shù)字化網(wǎng)站建設,提供企業(yè)網(wǎng)站建設,高端網(wǎng)站設計,響應式網(wǎng)站制作,設計師量身打造品牌風格,熱線:028-86922220SQL完整性約束條件中的主鍵、外鍵約束是什么意思
以一個例子來說明下。比如一個省表有省ID和省名,市表有市ID、慎亂市名和省ID那么在市表里面的外鍵就是省ID,當你設置了他們的約束,這樣起到一個數(shù)據(jù)完整性的作用,當你刪除一個省的時候,如果下面有市,那么你直接刪除是刪除不了的,這就是一種約束梁孝者,防止橡薯數(shù)據(jù)的不完整性
比如, 下面的例子
學號(PK),班級, 年級, 姓名
LODGE
SUSAN
在這個表里, 班級為01的記錄中, 年級卻有兩個2年級和1年級, 這就是冗余代來的問題了, 盡管可以通過對輸入的控制來避免這樣的情況, 但由于邏輯上的問題往往使處理程序很復雜, 又很容易造成BUG, 比如由于某種疏忽而出現(xiàn)上述情況,而使用這些數(shù)據(jù)的處理, 就極有可能出現(xiàn)錯誤,.
那么, 怎樣避免呢, 觀察上面幾個字段, 就不難發(fā)現(xiàn)年級對班級有依賴性, 換句話說, 只需知道班級就能知道年級了, 所以可以把表拆成這個樣子
S(學號(PK),班級(FK), 姓名)
C(班級(PK),年級)
這樣邏輯上就清晰了, 因為沒了冗余, 對輸入的控制就簡單了, 因為, 如果有疏忽, 就會引起錯誤, 而一旦寫到表里, 這樣的數(shù)據(jù)就肯定是完整的, 從而避免了很多后期處理上出現(xiàn)BUG的可能性
現(xiàn)在來看看 上面的設計, 在這里偶要利用這個機會來說明一下, 數(shù)據(jù)庫的設計思路.
s(學號(PK),姓名,編號(FK))
c(編號(PK),班級, 年級,系名)
偶猜想編號是對班級的編號, 所以這個結構和上面的結構是一致的
但是, 問題在于這個結構中比已知條件多了兩個字段, 編號和系名
這樣很容易引起新的問題, 比如編號作為主鍵它的值如何確定的問題(這很重要, 如果處理不當就會發(fā)生邏輯上的錯誤). 在初期設計中, 應當特別注意這些問題, 不要任意追加實際上不存在的字段, 這樣才能保證設計的嚴密性, 當然, 在處理中使用數(shù)字類型來保證處理的效率等問題是要考慮的, 不過這應該放在后面, 等到系統(tǒng)的團賣御基本邏輯完全確定了, 再做調整. 這樣一個過程, 就是從物理設計到邏輯設計的過程,
在這里所謂物理設計, 就是完全按照實際的情況, 做出的數(shù)據(jù)庫結構設計和處理邏輯塌巖設計. 在這一階段完全不需要考慮, 和數(shù)據(jù)庫庫應用有關的問題, 是純粹的現(xiàn)實的反映. 這一階段的原則是, 原原本本反映出現(xiàn)實的情況, 特別是要明確界定系統(tǒng)和用戶之間的分界點.
而所謂邏輯設計, 就是要把上面抽象好的物理設計進行優(yōu)化, 作出高效益的數(shù)據(jù)庫結構和系統(tǒng)處理流程, 并追加必要的邏輯字段如上面的編號和這些字段處理方法, 這時候的原則是, 完全反映物理邏輯并保持物理設計中已經(jīng)確定的用戶界面
就上面這個簡單的例子來說
在物理設計的時候, 偶們確定好了這樣的結構
S(學號(PK),班級(FK), 姓名)
C(班級(PK),年級)
這就意味著, 用戶只需知道
學號,班級, 姓名,年級
就能使用偶們的系統(tǒng)
而在邏輯設計階段, 偶們注意到, 實際上用戶對班級名稱有很多種不同的叫法, 直接作主鍵計算機處理起來比較難
因此, 設計出這樣的結構
s(學號(PK),姓名,編配態(tài)號(FK))
c(編號(PK),班級, 年級)
但是這樣用戶在輸入數(shù)據(jù)的時候, 就必須要明白班級編號的意思, 這不符合偶們所設計的物理界面的要求, 所以要再改進
s(學號(PK),姓名,編號(FK))
c(編號(PK),班級, 年級)
d(班級(PK), 編號)
偶們增加了表d這是一個字典, 它的作用是可以讓用戶輸入班級名而系統(tǒng)可以找到對應的編號, 請注意, 在d中的編號不是外鍵, 因為它和偶們的主處理邏輯沒有直接關系, 它只是個輔助表, 另外, c中保留了班級字段, 但這不是冗余, 這個班級和d的班級是兩個概念, 前者是班級的表示名稱, 而后者是班級的輸入名稱
最后, 要說明的是, 偶們的最終設計, 仍然犯了個錯誤, 這就是, 偶們增加了一個新物理流程-字典編輯, 這時候, 偶們需要和用戶共同討論, 看看他們是否真得愿意這么使用, 而通常的結果會是,
他們不打算用這個字典, 他們完全能夠使用標準輸入名稱, 于是偶們的字典里就只能保存一個名稱了, 顯然然偶們可以去掉這個表, 但用戶的保證是不可信的, 偶們不能允許在他們犯錯誤的情況下, 而使得系統(tǒng)可能保存錯誤的結果, 于是偶們再行調整偶們的設計方案
s(學號(PK),姓名,編號(FK))
c(編號(PK),班級(NOT NULL UNIQUE), 年級)
這個最終方案是這個意思, 因為偶們不信任用戶, 所以偶們仍然不能使用班級作為主鍵, 這樣即使用戶輸入有誤也不會增加錯誤的記錄, 根據(jù)物理邏輯的要求, 偶們把班級作為候補主鍵, 使它不能為空而且不能重復, 這樣就基本上滿足要求了, 顯然編號成為了內部邏輯字段, 它可以完全由偶們的系統(tǒng)自行決定
樓上貼那么多、暈了、我來簡單說明下、所謂主鍵呢、就相當于我們的身份證一樣、獨一無二含念、起到唯談碼困一標識的作用、而外鍵呢、比如在校讀書時、班級會有你的記錄、當意外輟學、原來的班級就會把你的信息刪除、這樣才能保證數(shù)據(jù)的完整性、其他的還模禪是什么外鍵約束、唯一約束、都是為了數(shù)據(jù)庫的規(guī)范性以及完整性建立的、 完全個人理解、祝君好運、、
關于sql 數(shù)據(jù)庫完整性約束的介紹到此就結束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關注本站。
創(chuàng)新互聯(lián)【028-86922220】值得信賴的成都網(wǎng)站建設公司。多年持續(xù)為眾多企業(yè)提供成都網(wǎng)站建設,成都品牌建站設計,成都高端網(wǎng)站制作開發(fā),SEO優(yōu)化排名推廣服務,全網(wǎng)營銷讓企業(yè)網(wǎng)站產生價值。
當前標題:SQL數(shù)據(jù)庫中的完整性約束詳解(sql數(shù)據(jù)庫完整性約束)
網(wǎng)頁網(wǎng)址:http://www.dlmjj.cn/article/dhhsijc.html


咨詢
建站咨詢
