約束是一種限制,它通過對錶的行或列的數據做出限制,來確保表的數據的完整性、唯一性。文章將在實踐操作中熟悉 MySQL 中的幾種約束。 ...
說明:文章所有內容均截選自用戶“實驗樓包工頭”發佈在實驗樓上的教程【MySQL 基礎課程】,想要詳細的學習SQL,點擊教程即可免費學習了;未經允許,禁止轉載;
約束是一種限制,它通過對錶的行或列的數據做出限制,來確保表的數據的完整性、唯一性。文章將在實踐操作中熟悉 MySQL 中的幾種約束。
1 約束分類
聽名字就知道,約束是一種限制,它通過對錶的行或列的數據做出限制,來確保表的數據的完整性、唯一性。
在MySQL中,通常有這幾種約束:
約束類型: | 主鍵 | 預設值 | 唯一 | 外鍵 | 非空 |
---|---|---|---|---|---|
關鍵字: | PRIMARY KEY | DEFAULT | UNIQUE | FOREIGN KEY | NOT NULL |
2 建立含約束的表
為了方便介紹這幾種約束,我們先建立一個資料庫。
當然不用你一行一行地輸入命令搭建這個資料庫,實驗樓已經為你準備好了。首先打開 Xfce 終端,輸入命令進入 /home/shiyanlou/Desktop
目錄:
cd Desktop
使用 git 命令將需要的數據文件下載到本地文件夾:
git clone https://github.com/shiyanlou/SQL3
下載完成後,輸入命令開啟 MySQL 服務並使用 root 用戶登錄:
#打開 MySQL 服務
sudo service mysql start
#使用 root 用戶登錄
mysql -u root
剛纔下載的 SQL3 目錄下,有個文件 MySQL-03-01.sql
,其中包含的代碼可以新建一個資料庫 mysql_shiyan
,然後在其中創建三張表 department
,employee
,project
,它們包含了各種約束。
(SQL3 目錄在桌面上,你可以用Gedit查看裡面的 MySQL-03-01.sql
文件。)
載入文件中的數據,需要在 MySQL 控制臺中輸入命令:
source /home/shiyanlou/Desktop/SQL3/MySQL-03-01.sql;
查看一下這個資料庫,輸入命令 show tables;
,可見:
3 主鍵
主鍵 (PRIMARY KEY)是用於約束表中的一行,作為這一行的唯一標識符,在一張表中通過主鍵就能準確定位到一行,因此主鍵十分重要。主鍵不能有重覆且不能為空。
在 MySQL-03-01.sql
中,這裡有主鍵:
也可以這樣定義主鍵:
還有一種特殊的主鍵——複合主鍵。主鍵不僅可以是表中的一列,也可以由表中的兩列或多列來共同標識,比如:
4 預設值約束
預設值約束 (DEFAULT) 規定,當有 DEFAULT 約束的列,插入數據為空時,將使用預設值。
在 MySQL-03-01.sql
中,這段代碼包含了 DEFAULT 約束:
DEFAULT 約束只會在使用 INSERT 語句(上一實驗介紹過)時體現出來,INSERT語句中,如果被 DEFAULT 約束的位置沒有值,那麼這個位置將會被 DEFAULT 的值填充,如語句:
# 正常插入數據
INSERT INTO department(dpt_name,people_num) VALUES('dpt1',11);
#插入新的數據,people_num 為空,使用預設值
INSERT INTO department(dpt_name) VALUES('dpt2');
輸入命令 SELECT * FROM department;
,可見表中第二行的people_num 被 DEFAULT 的值 (10) 填充:
5 唯一約束
唯一約束 (UNIQUE) 比較簡單,它規定一張表中指定的一列的值必須不能有重覆值,即這一列每個值都是唯一的。
在 MySQL-03-01.sql
中,也有 UNIQUE 約束:
當 INSERT 語句新插入的數據和已有數據重覆的時候,如果有 UNIQUE約束,則 INSERT 失敗,比如:
INSERT INTO employee VALUES(01,'Tom',25,3000,110110,'dpt1');
INSERT INTO employee VALUES(02,'Jack',30,3500,110110,'dpt2');
結果如圖:
6 外鍵約束
外鍵 (FOREIGN KEY) 既能確保數據完整性,也能表現表之間的關係。
一個表可以有多個外鍵,每個外鍵必須 REFERENCES (參考) 另一個表的主鍵,被外鍵約束的列,取值必須在它參考的列中有對應值。
在 INSERT 時,如果被外鍵約束的值沒有在參考列中有對應,比如以下命令,參考列 (department 表的 dpt_name) 中沒有dpt3,則INSERT 失敗:
INSERT INTO employee VALUES(02,'Jack',30,3500,114114,'dpt3');
可見之後將 dpt3 改為 dpt2(department 表中有 dpt2),則插入成功:
7 非空約束
非空約束 (NOT NULL),聽名字就能理解,被非空約束的列,在插入值時必須非空。
在MySQL中違反非空約束,不會報錯,只會有警告,比如以下語句:
#INSERT 成功 age 為空,因為沒有非空約束,表中顯示 NULL
INSERT INTO employee(id,name,salary,phone,in_dpt) VALUES(03,'Jim',3400,119119,'dpt2');
#警告 salary 被非空約束,值為空,表中顯示0
INSERT INTO employee(id,name,age,phone,in_dpt) VALUES(04,'Bob',23,123456,'dpt1');
結果如圖,出現警告,但還是插入數據成功,實驗樓的環境是 5.5.50
,5.6
版本以上的 MySQL 會報錯,禁止插入不符合非空約束的數據:
此時 employee 表的內容為:
總結
文章通過一個資料庫實例瞭解了主鍵、預設值、外鍵、非空、唯一這幾種約束的特性,這幾種約束都是最常見的,需要仔細理解每種約束的含義及使用場景。
教程【MySQL 基礎課程】共17個實驗+3個挑戰,課程列表如下: