mysql中约束_【MySQL】:MySQL中四大约束
所有的關(guān)系型數(shù)據(jù)庫都支持對數(shù)據(jù)表使用約束,在表上強(qiáng)制執(zhí)行數(shù)據(jù)校驗,保證數(shù)據(jù)的完整性。
MySQL數(shù)據(jù)庫支持以下四種約束形式:
非空約束 NOT NULL
所有數(shù)值類型的值都可以為null。
空字符串和0都不等于null。
-- 頭鐵之后的報錯信息:Column 'name' cannot be null
-- 1、創(chuàng)建表時添加約束
CREATE TABLE stu(
id INT,
NAME VARCHAR(20) NOT NULL
);
SELECT * FROM stu;
-- 2、表創(chuàng)建完畢之后,追加約束
ALTER TABLE stu MODIFY NAME VARCHAR(20) NOT NULL;
-- 3、 刪除name的非空約束
ALTER TABLE stu MODIFY NAME VARCHAR(20);
唯一約束 UNIQUE
保證指定的列不允許出現(xiàn)重復(fù)值,但是可以存在多個null值。
-- 頭鐵之后的報錯信息:Duplicate entry '1' for key 'phone_number'
-- 1、創(chuàng)建表時添加約束
CREATE TABLE stu(
id INT,
phone_number VARCHAR(20) UNIQUE
);
-- mySql中,唯一約束限定的列可以有多個null
-- 2、建表后追加唯一約束
ALTER TABLE stu MODIFY phone_number VARCHAR(20) UNIQUE;
-- 3、刪除唯一約束
ALTER TABLE stu DROP INDEX phone_number;
主鍵約束 PRIMARY KEY
主鍵約束的功能相當(dāng)于非空+唯一約束,既不允許出現(xiàn)重復(fù),也不允許出現(xiàn)null。
每個表中最多允許有一個主鍵,唯一確定一行記錄的字段。
-- 頭鐵之后的報錯信息:Duplicate entry '1' for key 'PRIMARY'
-- 1、創(chuàng)建表時,添加主鍵約束
CREATE TABLE student(
id INT PRIMARY KEY,
NAME VARCHAR(20)
);
SELECT * FROM student;
-- 2、建表后,追加主鍵
ALTER TABLE student MODIFY id INT PRIMARY KEY;
-- 3、刪除主鍵
ALTER TABLE student DROP PRIMARY KEY;
配合主鍵的自動增長
-- 自動增長,建議配合int類型的主鍵(如果不指定值,當(dāng)前值為上一值加一)
CREATE TABLE student(
id INT PRIMARY KEY AUTO_INCREMENT,
phone_number VARCHAR(20)
);
-- 創(chuàng)建表之后,追加自動增長
ALTER TABLE student MODIFY id INT AUTO_INCREMENT;
-- 刪除自動增長
ALTER TABLE student MODIFY id INT;
外鍵約束 FOREIGN KEY
外鍵約束用以通知數(shù)據(jù)庫與表字段之間的對應(yīng)關(guān)系,以維護(hù)數(shù)據(jù)的完整性。
-- 首先創(chuàng)建不含外鍵約束的“一對多”關(guān)系的兩張表
CREATE TABLE dept(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20)
);
INSERT INTO dept VALUES (NULL,'法師'),(NULL,'坦克'),(NULL,'劍客'),(NULL,'戰(zhàn)士');
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);
一對多的關(guān)系是,通過emp表中的dept_id字段關(guān)聯(lián)到dept表中的id字段,這樣我們一看到這個英雄是什么序號,就可以通過多表查詢,得到這個英雄具體的職業(yè)是啥。
在沒有添加外鍵約束的情況下,可能會出現(xiàn)以下幾種不合理的情況:
-- 不合理情況1:可以任意插入英雄,選擇不存在的職業(yè)
INSERT INTO emp VALUES(NULL,'艾希',5);
-- 不合理情況2:在仍有英雄存在的情況下,刪除這個職業(yè)
DELETE FROM dept WHERE id = 4;
很明顯,都是非常無理取鬧的請求,如何去解決呢,通過外鍵約束。
再來試著創(chuàng)建兩個表,并且添加上外鍵約束:
-- 新建表,添加外鍵
CREATE TABLE dept(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20)
);
INSERT INTO dept VALUES (NULL,'法師'),(NULL,'坦克'),(NULL,'劍客'),(NULL,'戰(zhàn)士');
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:我發(fā)現(xiàn)數(shù)據(jù)庫的報錯信息都非常直接,每次都能一眼看出來錯出在哪)
這時,如果想刪除這個職業(yè),也不是不可以,你需要把這個職業(yè)里面代表的英雄全給刪咯,這樣就可以刪除職業(yè)了。
-- 1.需要先刪除戰(zhàn)士英雄,也就是dept_id = 4的記錄
DELETE FROM emp WHERE dept_id = 4;
-- 2.接著刪除這個職業(yè),成功刪除
DELETE FROM dept WHERE id = 4;
當(dāng)然,外鍵約束這玩意兒,其實還是蠻危險的,因為在數(shù)據(jù)量很大的情況下,由于錯誤設(shè)置外鍵,可能會導(dǎo)致很多數(shù)據(jù)進(jìn)不了數(shù)據(jù)庫,也有可能會導(dǎo)致很多功能難以擴(kuò)展。
總結(jié)
以上是生活随笔為你收集整理的mysql中约束_【MySQL】:MySQL中四大约束的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 农行AL属于什么交易
- 下一篇: mysql -a 参数_mysql参数及