【MySQL】:MySQL中四大約束

全部的關係型數據庫都支持對數據表使用約束,在表上強制執行數據校驗,保證數據的完整性。數據庫

MySQL數據庫支持如下四種約束形式:code

非空約束 NOT NULL

全部數值類型的值均可覺得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);

惟一約束 UNIQUE

保證指定的列不容許出現重複值,可是能夠存在多個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;

主鍵約束 PRIMARY KEY

主鍵約束的功能至關於非空+惟一約束,既不容許出現重複,也不容許出現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;

外鍵約束 FOREIGN KEY

外鍵約束用以通知數據庫與表字段之間的對應關係,以維護數據的完整性。請求

-- 首先建立不含外鍵約束的「一對多」關係的兩張表
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;

固然,外鍵約束這玩意兒,其實仍是蠻危險的,由於在數據量很大的狀況下,因爲錯誤設置外鍵,可能會致使不少數據進不了數據庫,也有可能會致使不少功能難以擴展。

相關文章
相關標籤/搜索