MySql約束超詳細(xì)介紹
1. 什么是約束
約束對應(yīng)的英語單詞:constraint
在創(chuàng)建表的時候,我們可以給表中的字段加上一些約束,來保證表中的數(shù)據(jù)的完整性、有效性?。?!
約束的作用就是為了保證:表中的數(shù)據(jù)有效?。?/p>
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 兩個字段聯(lián)合起來具有唯一性?。?!
mysql> create table t_vip(id int, name varchar(255) unique, email varchar(255) unique);
這樣創(chuàng)建的表是不符合上述需求的,因為 name 具有唯一性,email 具有唯一性。兩個字段各自具有唯一性。
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 簡稱 pk
1. 主鍵約束的相關(guān)術(shù)語
- 主鍵約束:就是一種約束。
- 主鍵字段:該字段上添加了主鍵約束,這樣的字段叫做:主鍵字段。
- 主鍵值:主鍵字段中的每一個值都叫做:主鍵值。
2. 什么是主鍵以及有啥用
主鍵值是每一行記錄的唯一標(biāo)識
主鍵值是每一行記錄的身份證號?。。?/p>
記?。喝魏我粡埍矶紤?yīng)該有主鍵,沒有主鍵,表無效!?。?/p>
主鍵的特征:not null + unique(主鍵值不能是 NULL,同時也不能重復(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ù)合主鍵外,還擁有:
- 自然主鍵:主鍵值是一個自然數(shù),和業(yè)務(wù)沒有關(guān)系。
- 業(yè)務(wù)主鍵:主鍵值和業(yè)務(wù)緊密關(guān)聯(lián),例如拿銀行卡賬號做主鍵值。這就是業(yè)務(wù)主鍵!
實際開發(fā)中,使用自然主鍵多,很少使用業(yè)務(wù)主鍵?。?!
主鍵一旦和業(yè)務(wù)值掛鉤,可能會出現(xiàn)各種問題!?。?/p>
6. 外鍵約束
外鍵頁數(shù) foregin key 簡稱 fk
1. 外鍵約束的相關(guān)術(shù)語
- 外鍵約束:一種約束:foregin key。
- 外鍵字段:該字段上添加了外鍵約束。
- 外鍵值:外鍵字段當(dāng)中的每一個值。
2. 外鍵出現(xiàn)的原因
業(yè)務(wù)背景:
請設(shè)計數(shù)據(jù)庫表,來描述 “班級和學(xué)生” 的信息?
第一種方案:班級和學(xué)生存儲在一張表中
分析上述方案的缺點:數(shù)據(jù)冗余,空間浪費?。?!
第二種方案:班級一張表,學(xué)生一張表
當(dāng) cno 字段沒有任何約束的時候,可能會導(dǎo)致數(shù)據(jù)無效??赡艹霈F(xiàn)一個 102,但是 102 班級不存在,所以為了保證 cno 字段中的值都是 100 和 101,需要給 cno 字段添加外鍵約束。 那么:cno 字段就是外鍵字段。cno 字段中的每一個值都是外鍵值。
注意:
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);
注意:子表中的外鍵引用的父表中的某個字段,被引用的這個字段必須是主鍵嗎?
不一定是主鍵,但至少具有 unique 約束。
到此這篇關(guān)于MySql約束超詳細(xì)介紹的文章就介紹到這了,更多相關(guān)MySql約束內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MYSQL數(shù)據(jù)庫Innodb?引擎mvcc鎖實現(xiàn)原理
這篇文章主要介紹了MYSQL數(shù)據(jù)庫Innodb?引擎mvcc鎖實現(xiàn)原理,但是mvcc?的實現(xiàn)原理是什么呢?下文我們就來實例說明來mvcc?的實現(xiàn)原理,感興趣的小伙伴可以參考一下2022-05-05Docker安裝mysql配置大小寫不敏感掛載數(shù)據(jù)卷存儲操作步驟
這篇文章主要介紹了Docker安裝mysql配置大小寫不敏感掛載數(shù)據(jù)卷存儲操作步驟詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11mysql 5.7.17 免安裝版配置方法圖文教程(windows10)
這篇文章主要為大家詳細(xì)介紹了windows10下mysql 5.7.17 免安裝版配置方法圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-01-01MySQL實現(xiàn)統(tǒng)計過去12個月每個月的數(shù)據(jù)信息
這篇文章主要介紹了MySQL實現(xiàn)統(tǒng)計過去12個月每個月的數(shù)據(jù)信息,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12