MySQL約束(創(chuàng)建表時(shí)的各種條件說(shuō)明)
由于增刪改了emp表中的記錄,因此這里重新創(chuàng)建了一個(gè)腳本并使用
create database bjpowernnode; use bjpowernode; source C:\Users\Administrator\Desktop\bjpowernode.sql;
約束
1.什么是約束?
- 約束就是表中的限制條件
- 約束的關(guān)鍵字是:constraint
2. 約束的分類
- 非空約束
not null - 唯一性約束
unique - 主鍵約束
primary key - 外鍵約束
foreign key - 檢查約束 MySQL數(shù)據(jù)庫(kù)不支持,Oracle數(shù)據(jù)庫(kù)支持
1. not null(非空約束)
not null約束的字段,不能為null值,必須給具體的數(shù)據(jù)
創(chuàng)建表,給字段添加 非空約束【用戶的郵箱地址不能為空】
drop table if exists t_user; create table t_user( ?? ??? ?id int(10), ?? ??? ?name varchar(32) not null, ?? ??? ?email varchar (32) );


2. unique(唯一性約束)
創(chuàng)建表,保證郵箱地址唯一
create table t_user( id int(10), name varchar(32) not null, email varchar(128) unique );

unique約束的字段不能重復(fù),但是可以為null

以上的約束屬于列級(jí)約束
表級(jí)約束:
?create table t_user( ?? ? id int(10), ?? ? name varchar(32), ?? ? email varchar(128), ?? ? unique(email) ?);
1.使用表級(jí)約束給多個(gè)字段添加約束
?create table t_user( ?? ? id int(10), ?? ? name varchar(32), ?? ? email varchar(128), ?? ? unique(name,email) );
2.表級(jí)約束可以給約束起名,以后通過(guò)這個(gè)名字來(lái)刪除約束
? ?create table t_user( ?? ? ? id int(10), ?? ? ? name varchar(32), ?? ? ? email varchar(128), ?? ? ? constraint t_user_email_unique unique(email) ?);



not null 和unique可以聯(lián)合使用

3. primary key (主鍵約束)
1.主鍵涉及到的術(shù)語(yǔ):
- 主鍵約束
- 主鍵字段
- 主鍵值
2.以上三者之間的關(guān)系:
- 表中的某個(gè)字段添加主鍵約束之后,該字段稱為主鍵字段
- 主鍵字段中出現(xiàn)的每一個(gè)數(shù)據(jù)都被稱為主鍵值
3.給某個(gè)字段添加主鍵約束以后,該字段不能重復(fù),也不能為空
- 主鍵約束效果和''not null unique'' 相同,但是本質(zhì)不同,
- 主鍵約束除了可以做到''not null unique''之外
- 主鍵字段還會(huì)默認(rèn)添加''索引-index''
4. 一張表應(yīng)給有主鍵字段,如果沒(méi)有,表示這張表是無(wú)效的
- 主鍵值是當(dāng)前行數(shù)據(jù)的唯一標(biāo)識(shí)
- 主鍵值是當(dāng)前行數(shù)據(jù)的身份證號(hào)碼
- 即使表中的兩行記錄數(shù)據(jù)是完全相同的,
- 但是由于主鍵值不同,就認(rèn)為這是兩行完全不同的字段
5.無(wú)論是單一主鍵還是復(fù)合主鍵,一張表的主鍵約束只能有一個(gè)
- 給一個(gè)字段添加主鍵約束,被稱為單一主鍵約束
- 給多個(gè)字段聯(lián)合添加主鍵約束,被稱為復(fù)合主鍵
6.主鍵根據(jù)性質(zhì)分類:
- 自然主鍵:主鍵值是一個(gè)自然數(shù),這個(gè)主鍵和當(dāng)前的業(yè)務(wù)沒(méi)有關(guān)系
- 業(yè)務(wù)主鍵:主鍵值和當(dāng)前業(yè)務(wù)緊密相關(guān)
- 當(dāng)業(yè)務(wù)發(fā)生改變的時(shí)候,主鍵值通成會(huì)受到影響,所以業(yè)務(wù)主鍵之用很少。
單一主鍵,列級(jí)約束
create table t_user( ?? ?id int(10) primary key, ?? ?name varchar(32) );

單一主鍵,表極約束
?create table t_user( ?? ? id int(10), ?? ? name varchar(32), ?? ? primary key(id) );

復(fù)合主鍵:只能用表級(jí)約束
mysql> create table t_user( ? ? -> id int(10), ? ? -> name varchar(32), ? ? -> primary key(id,name) ? ? -> );


auto_increment:主鍵自增
MySQL數(shù)據(jù)管理系統(tǒng)中提供了一個(gè)自增的數(shù)字,專門(mén)用來(lái)自動(dòng)生成主鍵值
主鍵值不需要用戶維護(hù),也不需要用戶提供了,自動(dòng)生成的,
這個(gè)自增的數(shù)字默認(rèn)從1開(kāi)始以1遞增:1,2,3,4,....
mysql> create table t_user( ? ? -> id int(10) primary key auto_increment, ? ? -> name varchar(32) ? ? -> );

4. foreign key(外鍵約束)
1.外鍵約束涉及到的術(shù)語(yǔ):
- 外鍵約束
- 外鍵值
- 外鍵字段
2.以上三者之間的關(guān)系:
- 某個(gè)字段添加外鍵約束以后稱為外鍵字段
- 外鍵字段中的每一個(gè)數(shù)據(jù)稱為外鍵值
3.外鍵分為單一外鍵和復(fù)合外鍵
- 單一外鍵:給一個(gè)字段添加外鍵約束
- 復(fù)合外鍵:給多個(gè)字段添加外鍵約束
4.一張表中可以有多個(gè)外鍵字段
設(shè)計(jì)一個(gè)數(shù)據(jù)庫(kù)表,用來(lái)存儲(chǔ)學(xué)生和班級(jí)信息,給出兩種解決方案:
學(xué)生信息和班級(jí)信息之間的關(guān)系:一個(gè)班級(jí)對(duì)應(yīng)多個(gè)學(xué)生,這是典型的一對(duì)多的關(guān)系
在多的一方加外鍵
第一種設(shè)計(jì)方案:將學(xué)生信息和班級(jí)信息存儲(chǔ)到一張表中
第二種設(shè)計(jì)方案:將學(xué)生信息和班級(jí)信息分開(kāi)兩張表存儲(chǔ),學(xué)生表+班級(jí)表
- 學(xué)生表 t_student
| sno(主鍵約束) | sname | classno(外鍵約束) |
|---|---|---|
| 1 | jack | 100 |
| 2 | lucy | 100 |
| 3 | kk | 100 |
| 4 | smith | 200 |
| 5 | frank | 300 |
| 6 | jhh | 300 |
- 班級(jí)表t_calss
| cno(主鍵約束) | cname |
|---|---|
| 100 | 高三1班 |
| 200 | 高三2班 |
| 300 | 高三3班 |
為了保證t_student 表中的classno字段中的數(shù)據(jù)必須來(lái)自于t_class表中的cno字段中的數(shù)據(jù),有必要給t_student表中的classno字段添加外鍵約束,classno稱為外鍵字段,該字段中的值稱為外鍵值。
注意:
1.外鍵值可以為空
2.外鍵字段必須得引用這張表中的主鍵嗎?
- 外鍵字段引用一張表的字段的時(shí)候,被引用的字段必須具備唯一性
- 即具有unique約束,不一定非是主鍵
3.班級(jí)表為父表,學(xué)生表為子表
- 應(yīng)該先創(chuàng)建父表,再創(chuàng)建子表
- 刪除數(shù)據(jù)時(shí),應(yīng)該先刪除子表中的數(shù)據(jù),再刪除父表中的數(shù)據(jù)
- 插入數(shù)據(jù)時(shí),應(yīng)該先插入父表中的數(shù)據(jù),再刪除子表中的數(shù)據(jù)

DROP TABLE IF EXISTS t_student; DROP TABLE IF EXISTS t_class; CREATE TABLE t_class( cno INT(3) PRIMARY KEY, cname VARCHAR(128) NOT NULL UNIQUE ); CREATE TABLE t_student( sno INT(3) PRIMARY KEY, sname VARCHAR(32) NOT NULL, classno INT(3),-- 外鍵 CONSTRAINT t_student_class_fk FOREIGN KEY(classno) REFERENCES t_class(cno) ); INSERT INTO t_class(cno,cname) VALUES(100,'高三1班'); INSERT INTO t_class(cno,cname) VALUES(200,'高三2班'); INSERT INTO t_class(cno,cname) VALUES(300,'高三3班'); INSERT INTO t_student(sno,sname,classno) VALUES(1,'jack',100); INSERT INTO t_student(sno,sname,classno) VALUES(2,'lucy',100); INSERT INTO t_student(sno,sname,classno) VALUES(3,'hh',100); INSERT INTO t_student(sno,sname,classno) VALUES(4,'frank',200); INSERT INTO t_student(sno,sname,classno) VALUES(5,'smith',300); INSERT INTO t_student(sno,sname,classno) VALUES(6,'jhh',300); SELECT * FROM t_student; SELECT * FROM t_class; -- 添加失敗,因?yàn)橛型怄I約束 INSERT INTO t_student(sno,sname,classno) VALUES(8,'kk',500);
重點(diǎn):典型的一對(duì)多關(guān)系,設(shè)計(jì)時(shí)在多的一方加外鍵
5. 級(jí)聯(lián)更新與級(jí)聯(lián)刪除
在刪除父表中的數(shù)據(jù)的時(shí)候,級(jí)聯(lián)刪除子表中的數(shù)據(jù)
在更新父表中的數(shù)據(jù)的時(shí)候,級(jí)聯(lián)更新子表中的數(shù)據(jù)
以上的級(jí)聯(lián)更新和級(jí)聯(lián)刪除謹(jǐn)慎使用,
因?yàn)榧?jí)聯(lián)操作會(huì)使數(shù)據(jù)數(shù)據(jù)改變或刪除,數(shù)據(jù)是無(wú)價(jià)的。
語(yǔ)法:
- 級(jí)聯(lián)更新:
on update cascase - 級(jí)聯(lián)刪除:
on delete cascase


MySQL中對(duì)于有些約束的修改比較麻煩,所以應(yīng)該先刪除約束,再添加約束
刪除外鍵約束:
alter table t_student drop foreign key t_student_class_fk
添加外鍵約束并級(jí)聯(lián)更新:
alter table t_student add constraint t_student_class_fk foreign key(classno) references t_class(no) on delete cascade;
添加外鍵約束并級(jí)聯(lián)刪除:
alter table t_student add constraint t_student_class_fk foreign key(classno) references t_class(no) on update cascade;
級(jí)聯(lián)刪除


級(jí)聯(lián)更新


以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Mysql用戶創(chuàng)建以及權(quán)限賦予操作的實(shí)現(xiàn)
在MySQL中,創(chuàng)建新用戶并為其授予權(quán)限是一項(xiàng)常見(jiàn)的操作,本文主要介紹了Mysql用戶創(chuàng)建以及權(quán)限賦予操作的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10
詳解mysql8.018在linux上安裝與配置過(guò)程
這篇文章主要介紹了mysql8.018在linux上安裝與配置過(guò)程,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-01-01
windows10下mysql 8.0 下載與安裝配置圖文教程
這篇文章主要介紹了windows10下mysql 8.0 下載與安裝配置圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02
MySQL中slave_exec_mode參數(shù)詳解
本篇文章主要給大家講述了MySQL中slave_exec_mode參數(shù)的用法以及示例分析了出現(xiàn)的錯(cuò)誤問(wèn)題和解決辦法,需要的朋友參考學(xué)習(xí)下吧。2017-12-12
Mysql 常用的時(shí)間日期及轉(zhuǎn)換函數(shù)小結(jié)
本文是腳本之家小編給大家總結(jié)的一些常用的mysql時(shí)間日期以及轉(zhuǎn)換函數(shù),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2018-05-05

