日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

mysql中约束_【MySQL】:MySQL中四大约束

發(fā)布時間:2023/12/15 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql中约束_【MySQL】:MySQL中四大约束 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

所有的關(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。