??引言
???♂?作者簡介:生魚同學,大數(shù)據(jù)科學與技術專業(yè)碩士在讀?????,曾獲得華為杯數(shù)學建模國家二等獎??,MathorCup 數(shù)學建模競賽國家二等獎??,亞太數(shù)學建模國家二等獎??。
??研究方向:復雜網(wǎng)絡科學
??興趣方向:利用python進行數(shù)據(jù)分析與機器學習,數(shù)學建模競賽經(jīng)驗交流,網(wǎng)絡爬蟲等。
**約束作用于表中字段上的規(guī)則,用于限制儲存在表中的數(shù)據(jù)。**在本文中我們主要介紹SQL中約束分類以及約束以及約束的不同類型,并作出演示。
??約束
首先我們來看約束的主要分類,常見的約束分類如下:
約束 | 描述 | 關鍵字 |
---|---|---|
非空約束 | 限制該字段的數(shù)據(jù)不能為NULL | NOT NULL |
唯一約束 | 保證該字段的所有數(shù)據(jù)都是唯一、不重復的 | UNIQUE |
主鍵約束 | 主鍵是一行數(shù)據(jù)的唯一標識,要求非空且唯一 | PRIMARY KEY |
默認約束 | 保存數(shù)據(jù)時,如果未指定該字段的值,則采用默認值 | DEFAULT |
檢查約束 | 保證字段值滿足一個條件 | CHECK |
外鍵約束 | 用來讓兩張表之間建立連接,保證數(shù)據(jù)的一致和完整 | FOREIGN KEY |
我們可以選擇在創(chuàng)建表或修改表的過程中進行約束的添加。
接下來,我們將會根據(jù)不同的約束類型進行分別介紹與演示。
??非空約束
非空約束限制字段的數(shù)據(jù)不能為NULL,非空約束的關鍵字為NOT NULL。當我們希望在創(chuàng)建表的過程中添加非空約束的時候,我們可以使用下面的代碼:
# 創(chuàng)建一個名為TABLE_NAME的表并且將Id和AGE設為非空
CREATE TABLE TABLE_NAME
(
Id int NOT NULL,
AGE varchar(10) NOT NULL
)
當表已經(jīng)創(chuàng)建后,我們可以使用下面的代碼為字段添加約束:
ALTER TABLE TABLE_NAME ADD NOT NULL ( Id )
在我的數(shù)據(jù)庫中,我已經(jīng)預先創(chuàng)建了表EMP,建表結構如下:
如果我們想為name加上非空的約束,可以使用下面的代碼:
ALTER TABLE EMP MODIFY name varchar(255) NOT NULL;
結果如下:
當我們在這時想要插入一個數(shù)據(jù)的時候,我們發(fā)現(xiàn)沒有name的設定已經(jīng)不能夠插入了:
另外,刪除上述約束的代碼為:
ALTER TABLE EMP MODIFY varchar(255) NOT NULL;
??唯一約束
唯一約束表示該字段是唯一的,表示為UNIQUE。同樣的添加唯一約束有兩種方法,一種是在創(chuàng)建表結構的時候進行添加,另一種是創(chuàng)建表后進行更改,代碼如下:
# 表示對AGE進行唯一約束
CREATE TABLE TABLE_NAME
(
Id int NOT NULL,
AGE varchar(10) UNIQUE
)
另外,我們還可以在建表的時候對某字段進行約束的命名,代碼如下:
CREATE TABLE EMP
(
Id int NOT NULL,
AGE varchar(10)
CONSTRAINT UNIQUE EMP_ID_AGE UNIQUE (Id,AGE)
)
同樣的,我們也可以在表創(chuàng)建后對唯一約束進行添加以及刪除,代碼如下:
# 為Id添加唯一約束
ALTER TABLE EMP ADD UNIQUE (Id);
ALTER TABLE EMP ADD CONSTRAINT uc_EMP_ID_AGE UNIQUE (Id,AGE);
# 刪除名為uc_EMP_ID_AGE 的唯一約束
ALTER TABLE EMP DROP CONSTRAINT uc_EMP_ID_AGE;
??主鍵約束
主鍵在每個表中只有一個,其是唯一的值并且不能包括NULL值,同樣的我們可以在創(chuàng)建表的過程中指定主鍵或者在創(chuàng)建表后添加主鍵,代碼如下:
CREATE TABLE EMP
(
Id int PRIMARY KEY,
AGE varchar(10)
)
在創(chuàng)建表后,我們可以通過ALTER來進行主鍵的添加和取消,代碼如下所示:
# 為名為TABLE_NAME 的表的字段Id添加主鍵
ALTER TABLE TABLE_NAME ADD PRIMARY KEY (Id)
# 刪除表中的主鍵
ALTER TABLE TABLE_NAME DROP PRIMARY KEY
??默認約束
當我們想對某些字段進行默認值的設定時,可以使用默認約束,這種約束能夠對插入的時候的數(shù)據(jù)賦予一個我們初始化的默認值,代碼如下:
CREATE TABLE EMP
(
Id int NOT NULL,
NANME varchar(255) DEFAULT '無名氏'
)
或者在建表后對表格加上或者刪除默認的約束,代碼如下:
# 添加一個默認約束
ALTER TABLE EMP ALTER NANME SET DEFAULT '無名氏'
# 刪除一個默認約束
ALTER TABLE EMP; ALTER NANME DROP DEFAULT;
??檢查約束
當我們希望都某個字段的值進行檢查時,可以使用檢查約束限定范圍,可以在建表的過程中對其添加檢查的條件,代碼如下:
# 在括號中傳入約束條件
CREATE TABLE EMP
(
Id int NOT NULL CHECK (Id>0),
NANME varchar(255) NOT NULL
)
我們可以對后續(xù)添加的約束進行命名,從而更好的刪除約束以及操作約束,代碼如下:
ALTER TABLE EMP ADD CHECK (Id>0);
# 我們對該檢查約束命名為chk_emp
ALTER TABLE EMP ADD CONSTRAINT chk_emp CHECK (Id>0 AND MAME='路人甲');
另外,刪除約束也可以在建表之后進行。這時我們就可以利用其約束名,代碼如下:
ALTER TABLE EMP DROP CONSTRAINT chk_emp;
??外鍵約束
??外鍵的添加
添加外鍵可以把表進行鏈接,為了更好的解釋外鍵,我們首先看一個例子:
假設我們員工表(EMP)如下:
Id | 名字 | 部門 |
---|---|---|
1 | 張三 | 1 |
2 | 李四 | 2 |
3 | 王五 | 3 |
我們還有一個部門表(PARTY)如下:
Id | 部門 |
---|---|
1 | 研發(fā)部 |
2 | 銷售部 |
3 | 營銷部 |
此時員工表的部門字段就是一個外鍵,我們通常把部門表稱作母表,而員工表稱作子表。在SQL中我們可以在創(chuàng)建的時候添加外鍵,或者創(chuàng)建后添加外鍵,代碼如下:
CREATE TABLE EMP
(
Id int PRIMARY KEY,
NAME varchar(10) NOT NULL,
PARTY_ID int,
FOREIGN KEY (Id ) REFERENCES PARTY(Id)
)
特別的,在創(chuàng)建表后添加外鍵的代碼如下:
ALTER TABLE EMP ADD CONSTRAINT FOREIGN_PARTY FOREIGN KEY (Id) REFERENCES PARTY(Id);
與此同時我們也可以撤銷外鍵的約束,代碼如下:
ALTER TABLE Orders DROP FOREIGN KEY FOREIGN_PARTY;
??刪除/更新外鍵
當我們對表的某字段設定了外鍵時,刪除外鍵中的數(shù)據(jù)通常是不允許的,假如我們希望外鍵的數(shù)據(jù)改變時在子表的操作發(fā)生改變,可以使用不同的行為對外鍵的更新或者刪除做限定,行為分為以下幾類:
行為 | 說明 |
---|---|
NO ACTION | 當在父表中刪除/更新對應記錄時,首先檢查該記錄是否有對應外鍵,如果有則不允許刪除/更新。(與 RESTRICT 一致) |
RESTRICT | 當在父表中刪除/更新對應記錄時,首先檢查該記錄是否有對應外鍵,如果有則不允許刪除/更新。(與 NO ACTION一致 |
CASCADE | 當在父表中刪除/更新對應記錄時,首先檢查該記錄是否有對應外鍵,如果有,則也刪除/更新外鍵在子表中的記錄。 |
SETNULL | 當在父表中刪除對應記錄時,首先檢查該記錄是否有對應外鍵,如果有則設置子表中該外鍵值為ull(這就要求該外鍵允許取nul)。 |
SETDEFAULT | 父表有變更時,子表將外鍵列設置成一個默認的值(Innodb不支持) |
設頂外鍵更新或刪除行為的語句如下所示: |
# 對EMP表中的Id設置外鍵PARTY表中的Id
# 在更新PARTY表中的內容時檢查該記錄是否有對應外鍵,如果有,則也刪除/更新外鍵在子表中的記錄。
# 在刪除PARTY表中的內容時首先檢查該記錄是否有對應外鍵,如果有則設置子表中該外鍵值為ull(這就要求該外鍵允許取nul)。
ALTER TABLE EMP ADD CONSTRAINT FOREIGN_PARTY FOREIGN KEY (Id) REFERENCES PARTY(Id) ON UPDATE CASCADE ON DELETE SET NULL;
??總結
本次列舉了SQL中常用約束相關語句,在實際學習的過程中還需要多學習以及使用才能熟練掌握。文章來源:http://www.zghlxwxcb.cn/news/detail-771098.html
余下的SQL內容我也將持續(xù)更新,如果感興趣的話不妨訂閱本專欄或者點個關注,我們下次再見。文章來源地址http://www.zghlxwxcb.cn/news/detail-771098.html
到了這里,關于【建議收藏】數(shù)據(jù)庫 SQL 入門——約束(內附演示)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!