全部的關係型數據庫都支持對數據表使用約束,在表上強制執行數據校驗,保證數據的完整性。數據庫
MySQL數據庫支持如下四種約束形式:code
全部數值類型的值均可覺得null。字符串
空字符串和0都不等於null。it
-- 頭鐵以後的報錯信息:Column 'name' cannot be null -- 一、建立表時添加約束 CREATE TABLE stu( id INT, NAME VARCHAR(20) NOT NULL ); SELECT * FROM stu; -- 二、表建立完畢以後,追加約束 ALTER TABLE stu MODIFY NAME VARCHAR(20) NOT NULL; -- 三、 刪除name的非空約束 ALTER TABLE stu MODIFY NAME VARCHAR(20);
保證指定的列不容許出現重複值,可是能夠存在多個null值。class
-- 頭鐵以後的報錯信息:Duplicate entry '1' for key 'phone_number' -- 一、建立表時添加約束 CREATE TABLE stu( id INT, phone_number VARCHAR(20) UNIQUE ); -- mySql中,惟一約束限定的列能夠有多個null -- 二、建表後追加惟一約束 ALTER TABLE stu MODIFY phone_number VARCHAR(20) UNIQUE; -- 三、刪除惟一約束 ALTER TABLE stu DROP INDEX phone_number;
主鍵約束的功能至關於非空+惟一約束,既不容許出現重複,也不容許出現null。擴展
每一個表中最多容許有一個主鍵,惟一肯定一行記錄的字段。date
-- 頭鐵以後的報錯信息:Duplicate entry '1' for key 'PRIMARY' -- 一、建立表時,添加主鍵約束 CREATE TABLE student( id INT PRIMARY KEY, NAME VARCHAR(20) ); SELECT * FROM student; -- 二、建表後,追加主鍵 ALTER TABLE student MODIFY id INT PRIMARY KEY; -- 三、刪除主鍵 ALTER TABLE student DROP PRIMARY KEY;
-- 自動增加,建議配合int類型的主鍵(若是不指定值,當前值爲上一值加一) CREATE TABLE student( id INT PRIMARY KEY AUTO_INCREMENT, phone_number VARCHAR(20) ); -- 建立表以後,追加自動增加 ALTER TABLE student MODIFY id INT AUTO_INCREMENT; -- 刪除自動增加 ALTER TABLE student MODIFY id INT;
外鍵約束用以通知數據庫與表字段之間的對應關係,以維護數據的完整性。請求
-- 首先建立不含外鍵約束的「一對多」關係的兩張表 CREATE TABLE dept( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20) ); INSERT INTO dept VALUES (NULL,'法師'),(NULL,'坦克'),(NULL,'劍客'),(NULL,'戰士'); CREATE TABLE emp( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20), dept_id INT ); INSERT INTO emp VALUES (NULL,'佐伊',1),(NULL,'扎克',2),(NULL,'亞索',3),(NULL,'蓋倫',4);
一對多的關係是,經過emp表中的dept_id字段關聯到dept表中的id字段,這樣咱們一看到這個英雄是什麼序號,就能夠經過多表查詢,獲得這個英雄具體的職業是啥。im
在沒有添加外鍵約束的狀況下,可能會出現如下幾種不合理的狀況:
-- 不合理狀況1:能夠任意插入英雄,選擇不存在的職業 INSERT INTO emp VALUES(NULL,'艾希',5); -- 不合理狀況2:在仍有英雄存在的狀況下,刪除這個職業 DELETE FROM dept WHERE id = 4;
很明顯,都是很是無理取鬧的請求,如何去解決呢,經過外鍵約束。
再來試着建立兩個表,而且添加上外鍵約束:
-- 新建表,添加外鍵 CREATE TABLE dept( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20) ); INSERT INTO dept VALUES (NULL,'法師'),(NULL,'坦克'),(NULL,'劍客'),(NULL,'戰士'); CREATE TABLE emp( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20), dept_id INT, -- 不是最後一行,注意加上逗號 FOREIGN KEY(dept_id) REFERENCES dept(id)-- 添加外鍵約束(emp中的dep_id字段依賴於dept表中的id字段) ); INSERT INTO emp VALUES (NULL,'佐伊',1),(NULL,'扎克',2),(NULL,'亞索',3),(NULL,'蓋倫',4);
這個時候再搞一搞無理取鬧的要求試試,這個時候就不可了,會報錯呢。
-- Cannot add or update a child row: a foreign key constraint fails (xxx省略) -- Cannot delete or update a parent row: a foreign key constraint fails (xxx省略)
(ps:我發現數據庫的報錯信息都很是直接,每次都能一眼看出來錯出在哪)
這時,若是想刪除這個職業,也不是不能夠,你須要把這個職業裏面表明的英雄全給刪咯,這樣就能夠刪除職業了。
-- 1.須要先刪除戰士英雄,也就是dept_id = 4的記錄 DELETE FROM emp WHERE dept_id = 4; -- 2.接着刪除這個職業,成功刪除 DELETE FROM dept WHERE id = 4;
固然,外鍵約束這玩意兒,其實仍是蠻危險的,由於在數據量很大的狀況下,因爲錯誤設置外鍵,可能會致使不少數據進不了數據庫,也有可能會致使不少功能難以擴展。