MySql約束超詳細(xì)介紹
1. 什么是約束
約束對(duì)應(yīng)的英語(yǔ)單詞:constraint
在創(chuàng)建表的時(shí)候,我們可以給表中的字段加上一些約束,來(lái)保證表中的數(shù)據(jù)的完整性、有效性!??!
約束的作用就是為了保證:表中的數(shù)據(jù)有效!!
2. 約束包括哪些
非空約束 not null
唯一性約束 unique
主鍵約束 primary key
外鍵約束 foreign key
檢查約束 check
3. 非空約束
非空約束 not null 約束的字段不能為 NULL
mysql> create table t_vip(id int, name varchar(255) not null);

mysql> insert into t_vip(id, name) values(1, 'zhangsan'); mysql> insert into t_vip(id, name) values(2, 'lisi');

mysql> insert into t_vip(id) values(3); ERROR 1364 (HY000): Field 'name' doesn't have a default value

4. 唯一性約束
唯一性約束 unique 約束的字段不能重復(fù),但是可以為 NULL
1. 單字段唯一性約束
mysql> create table t_vip(id int, name varchar(255) unique, email varchar(255));

mysql> insert into t_vip(id, name, email) values(3, 'lisi', 'lisi@123.com'); ERROR 1062 (23000): Duplicate entry 'lisi' for key 't_vip.name'
mysql> select * from t_vip;

2. 多字段唯一性約束
需求:name 和 email 兩個(gè)字段聯(lián)合起來(lái)具有唯一性?。?!
mysql> create table t_vip(id int, name varchar(255) unique, email varchar(255) unique);
這樣創(chuàng)建的表是不符合上述需求的,因?yàn)?name 具有唯一性,email 具有唯一性。兩個(gè)字段各自具有唯一性。
mysql> create table t_vip(id int, name varchar(255), email varchar(255), unique(name, email));
mysql> insert into t_vip(id, name, email) values(1, 'zhangsan', 'zhangsan@123.com'); mysql> insert into t_vip(id, name, email) values(1, 'zhangsan', 'zhangsan@sina.com');

5. 主鍵約束
主鍵約束 primary key 簡(jiǎn)稱 pk
1. 主鍵約束的相關(guān)術(shù)語(yǔ)
- 主鍵約束:就是一種約束。
- 主鍵字段:該字段上添加了主鍵約束,這樣的字段叫做:主鍵字段。
- 主鍵值:主鍵字段中的每一個(gè)值都叫做:主鍵值。
2. 什么是主鍵以及有啥用
主鍵值是每一行記錄的唯一標(biāo)識(shí)
主鍵值是每一行記錄的身份證號(hào)?。?!
記?。喝魏我粡埍矶紤?yīng)該有主鍵,沒(méi)有主鍵,表無(wú)效?。?!
主鍵的特征:not null + unique(主鍵值不能是 NULL,同時(shí)也不能重復(fù))
3. 單一主鍵
mysql> create table t_vip(id int primary key, name varchar(255));

主鍵不能重復(fù)
mysql> insert into t_vip(id, name) values(2, 'lisi'); ERROR 1062 (23000): Duplicate entry '2' for key 't_vip.PRIMARY'

主鍵不能為NULL
mysql> insert into t_vip(name) values('lisi');
ERROR 1364 (HY000): Field 'id' doesn't have a default value

4. 復(fù)合主鍵
mysql> create table t_vip(id int, name varchar(255), email varchar(255), primary key(id, name));

mysql> insert into t_vip(id, name, email) values(1, 'zhangsan', 'zhansgan@123.com'); mysql> insert into t_vip(id, name, email) values(1, 'lisi', 'lisi@123.com');

5. 其他主鍵
除了單一主鍵和復(fù)合主鍵外,還擁有:
- 自然主鍵:主鍵值是一個(gè)自然數(shù),和業(yè)務(wù)沒(méi)有關(guān)系。
- 業(yè)務(wù)主鍵:主鍵值和業(yè)務(wù)緊密關(guān)聯(lián),例如拿銀行卡賬號(hào)做主鍵值。這就是業(yè)務(wù)主鍵!
實(shí)際開(kāi)發(fā)中,使用自然主鍵多,很少使用業(yè)務(wù)主鍵!!!
主鍵一旦和業(yè)務(wù)值掛鉤,可能會(huì)出現(xiàn)各種問(wèn)題!??!
6. 外鍵約束
外鍵頁(yè)數(shù) foregin key 簡(jiǎn)稱 fk
1. 外鍵約束的相關(guān)術(shù)語(yǔ)
- 外鍵約束:一種約束:foregin key。
- 外鍵字段:該字段上添加了外鍵約束。
- 外鍵值:外鍵字段當(dāng)中的每一個(gè)值。
2. 外鍵出現(xiàn)的原因
業(yè)務(wù)背景:
請(qǐng)?jiān)O(shè)計(jì)數(shù)據(jù)庫(kù)表,來(lái)描述 “班級(jí)和學(xué)生” 的信息?
第一種方案:班級(jí)和學(xué)生存儲(chǔ)在一張表中

分析上述方案的缺點(diǎn):數(shù)據(jù)冗余,空間浪費(fèi)?。?!
第二種方案:班級(jí)一張表,學(xué)生一張表


當(dāng) cno 字段沒(méi)有任何約束的時(shí)候,可能會(huì)導(dǎo)致數(shù)據(jù)無(wú)效。可能出現(xiàn)一個(gè) 102,但是 102 班級(jí)不存在,所以為了保證 cno 字段中的值都是 100 和 101,需要給 cno 字段添加外鍵約束。 那么:cno 字段就是外鍵字段。cno 字段中的每一個(gè)值都是外鍵值。
注意:
t_class 是父表 t_student 是字表
刪除表的順序?
先刪子,再刪父。
創(chuàng)建表的順序?
先創(chuàng)建父,再創(chuàng)建子。
刪除數(shù)據(jù)的順序?
先刪子,再刪父。
插入數(shù)據(jù)的順序?
先插入父,再插入子。
3. 創(chuàng)建外鍵表
創(chuàng)建表
mysql> create table t_class(classno int primary key, classname varchar(255)); mysql> create table t_student(no int primary key auto_increment, name varchar(255), cno int, foreign key(cno) references t_class(classno));


插入數(shù)據(jù)
mysql> insert into t_class(classno, classname) values(100, '北京市大興區(qū)亦莊鎮(zhèn)第二中學(xué)高三1班'); mysql> insert into t_class(classno, classname) values(101, '北京市大興區(qū)亦莊鎮(zhèn)第二中學(xué)高三2班');

mysql> insert into t_student(name, cno) values('jack', 100);
mysql> insert into t_student(name, cno) values('lucy', 100);
mysql> insert into t_student(name, cno) values('lilei', 100);
mysql> insert into t_student(name, cno) values('hanmeimei', 100);
mysql> insert into t_student(name, cno) values('zhangsan', 100);
mysql> insert into t_student(name, cno) values('lisi', 100);
mysql> insert into t_student(name, cno) values('wangwu', 100);
mysql> insert into t_student(name, cno) values('zhaoliu', 100);

注意:子表中的外鍵引用的父表中的某個(gè)字段,被引用的這個(gè)字段必須是主鍵嗎?
不一定是主鍵,但至少具有 unique 約束。
到此這篇關(guān)于MySql約束超詳細(xì)介紹的文章就介紹到這了,更多相關(guān)MySql約束內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL數(shù)據(jù)庫(kù)被鎖定的問(wèn)題解決
本文主要介紹了MySQL數(shù)據(jù)庫(kù)被鎖定的問(wèn)題解決方法,包括通過(guò)刷新錯(cuò)誤連接、修改max_connection_errors的數(shù)量、執(zhí)行flush?host或者?mysqladmin?flush-hosts等方式進(jìn)行解決,感興趣的可以了解一下2024-10-10
MySQL BinLog如何恢復(fù)誤更新刪除數(shù)據(jù)
這篇文章主要介紹了MySQL BinLog如何恢復(fù)誤更新刪除數(shù)據(jù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06
Window下如何恢復(fù)被刪除的Mysql8.0.17 Root賬戶及密碼
這篇文章主要介紹了Window下如何恢復(fù)被刪除的Mysql8.0.17 Root賬戶及密碼,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02
mysql中刪除數(shù)據(jù)的幾種方法(最新推薦)
在MySQL數(shù)據(jù)庫(kù)中,刪除數(shù)據(jù)是一個(gè)常見(jiàn)的操作,它允許從表中移除不再需要的數(shù)據(jù),在執(zhí)行刪除操作時(shí),需要謹(jǐn)慎,以免誤刪重要數(shù)據(jù),本文給大家介紹mysql中刪除數(shù)據(jù)的幾種方法,感興趣的朋友一起看看吧2023-11-11
linux系統(tǒng)下實(shí)現(xiàn)mysql熱備份詳細(xì)步驟(mysql主從復(fù)制)
這篇文章主要介紹了linux系統(tǒng)下實(shí)現(xiàn)MySQL主從熱備份2013-12-12
Windows環(huán)境下的MYSQL5.7配置文件定位圖文分析
本文通過(guò)圖文并茂的形式給大家介紹了Windows環(huán)境下的MYSQL5.7配置文件定位 ,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-05-05
MySQL字符串索引更合理的創(chuàng)建規(guī)則討論
這篇文章主要給大家介紹了關(guān)于MySQL字符串索引更合理的創(chuàng)建規(guī)則,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用MySQL具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
Node.js下向MySQL數(shù)據(jù)庫(kù)插入批量數(shù)據(jù)的方法
這篇文章主要介紹了Node.js下向MySQL數(shù)據(jù)庫(kù)插入批量數(shù)據(jù)的實(shí)現(xiàn)方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-10-10

