標籤:
一、簡介
約束是一種限制,它通過對錶的行或列的資料做出限制,來確保表的資料的完整性、唯一性。本節實驗就在操作中熟悉MySQL中的幾種約束。
二、內容1、約束分類
聽名字就知道,約束是一種限制,它通過對錶的行或列的資料做出限制,來確保表的資料的完整性、唯一性。
在MySQL中,通常有這幾種約束:
約束類型: |
主鍵 |
預設值 |
唯一 |
外鍵 |
非空 |
關鍵字: |
PRIMARY KEY |
DEFAULT |
UNIQUE |
FOREIGN KEY |
NOT NULL |
2、建立含約束的表
為了方便介紹這幾種約束,我們先建立一個資料庫。
當然不用你一行一行地輸入命令搭建這個資料庫,實驗樓已經為你準備好了。首先輸入命令進入Desktop:
cd Desktop
git clone http://git.shiyanlou.com/shiyanlou/SQL3
下載完成後,輸入“cd ~”(注意有空格)退回到原先目錄,然後輸入命令開啟MySQL服務並使用root使用者登入:
sudo service mysql start #開啟MySQL服務mysql -u root #使用root使用者登入
剛才從github下載的SQL3目錄下,有個檔案“MySQL-03-01.sql”,其中包含的代碼可以建立一個資料庫“mysql_shiyan”,然後在其中建立三張表“department”,“employee”,“project”,它們包含了各種約束。
(SQL3目錄在案頭上,你可以用Gedit查看裡面的MySQL-03-01.sql檔案。)
運行這個檔案,輸入命令:
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);INSERT INTO department(dpt_name) VALUES(‘dpt2‘); #people_num為空白
輸入命令“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 INTO employee(id,name,salary,phone,in_dpt) VALUES(03,‘Jim‘,3400,119119,‘dpt2‘); #INSERT成功 age為空白,因為沒有非空約束,表中顯示NULLINSERT INTO employee(id,name,age,phone,in_dpt) VALUES(04,‘Bob‘,23,123456,‘dpt1‘); #警告 salary被非空約束,值為空白,表中顯示0
結果,出現警告,但還是插入資料成功:
此時employee表的內容為:
(大資料工程師學習路徑)第四步 SQL基礎課程----約束