MySQL數(shù)據(jù)庫約束深入詳解
一、數(shù)據(jù)庫約束的概念
數(shù)據(jù)庫約束是指對數(shù)據(jù)庫表中的數(shù)據(jù)所施加的規(guī)則或條件,用于確保數(shù)據(jù)的準(zhǔn)確性和可靠性。這些約束可以是基于數(shù)據(jù)類型、值范圍、唯?性、非空等規(guī)則,以確保數(shù)據(jù)的正確性和相容性。如果出現(xiàn)了一些錯誤,人工檢查的工作量非常大,于是在數(shù)據(jù)庫中定義了一些約束,讓數(shù)據(jù)庫幫我們自動檢測。
二、約束類型
約束類型 | 說明 |
NOT NULL非空約束 | 指定非空約束的列不能存儲 NULL 值 |
DEFALUT 默認(rèn)約束 | 當(dāng)沒有給列賦值時使用的默認(rèn)值 |
UNIQUE 唯?約束 | 指定唯?約束的列每行數(shù)據(jù)必須有唯?的值 |
PRIMARY KEY 主鍵約束 | NOT NULL 和 UNIQUE的結(jié)合,可以指定?個列或多個列,有助于防止數(shù)據(jù)重復(fù)和提高數(shù)據(jù)的查詢性能 |
FOREIGN KEY 外鍵約束 | 外鍵約束是?種關(guān)系約束,用于定義兩個表之間的關(guān)聯(lián)關(guān)系,可以確保數(shù)據(jù)的完整性和?致性 |
CHECK 約束 | 用于限制列或數(shù)據(jù)在數(shù)據(jù)庫表中的值,確保數(shù)據(jù)的準(zhǔn)確性和可靠性 |
三、NOT NULL 非空約束
定義表時某列不允許為NULL時,可以為列添加非空約束。如果預(yù)見某個列不能為空,強(qiáng)烈建議加非空約束,會對查詢性能產(chǎn)生積極影響。
create table student( id bigint default null, `name` varchar(25) not null ); insert into student(id,`name`) values (1,null);
create table student( id bigint default null, `name` varchar(25) not null ); insert into student(id,`name`) values (1,'張三');
查看表結(jié)構(gòu),YES表示當(dāng)前列可以為空,NO表示當(dāng)前列不可以為空。
desc student;
四、DEFAULT 默認(rèn)值約束
DEFAULT約束用于向列中插入默認(rèn)值,如果沒有為列設(shè)置值,那么會將默認(rèn)值設(shè)置到該列。
create table student( id bigint primary key auto_increment, `name` varchar(20) not null, age int default 18 ); -- 不指定使用默認(rèn)值 insert into student (`name`) values ('張三'); -- 手動指定年齡值 insert into student (`name`,age) values ('李四',19); -- 也可以指定為null insert into student (`name`,age) values ('王五',null);
五、UNIQUE 唯一約束
指定了唯一約束的列,該列的值在所有記錄中不能重復(fù),比如?個?的身份證號,學(xué)生的學(xué)號等。如果預(yù)見某個列不能為空,強(qiáng)烈建議加非空約束,會對查詢性能產(chǎn)生積極影響。
create table student( id bigint unique, `name` varchar(25) not null ); insert into student(id,`name`) values (1,'張三'); insert into student(id,`name`) values (1,'李四');
create table student( id bigint unique, `name` varchar(25) not null ); insert into student(id,`name`) values (1,'張三'); insert into student(id,`name`) values (2,'李四');
唯一約束只會約束列值是否唯一,并不會約束空值,也就是我們可以寫入多個null。
insert into student(id,`name`) values (null,'王五1'); insert into student(id,`name`) values (null,'王五2'); insert into student(id,`name`) values (null,'王五3'); select * from student;
六、PRIMARY KEY 主鍵約束
- 主鍵約束唯一標(biāo)識數(shù)據(jù)庫表中的每條記錄
- 主鍵必須包含唯一的值,且不能包含 NULL 值
- 每個表只能有一個主鍵,可以由單個列或多個列組成
- 通常為每張表都指定?個主鍵,主鍵列建議使?BIGINT類型
create table student( id bigint primary key, `name` varchar(25) not null ); desc student;
那如果說,某一列要求為非空且唯一,我們可不可以將其設(shè)置為主鍵呢?是不可以的,因為主鍵是數(shù)據(jù)表的一個特性,數(shù)據(jù)如何組織依賴于主鍵這個特性;而非空且唯一是業(yè)務(wù)規(guī)則。
通常把主鍵列設(shè)置為自動增長,讓數(shù)據(jù)庫維護(hù)主鍵值,這樣我們寫入數(shù)據(jù)時,不用人為的去維護(hù)主鍵值,只需要寫入業(yè)務(wù)值即可。
create table student( id bigint primary key auto_increment, `name` varchar(25) not null ); desc student;
insert into student(`name`) values ('張三'); insert into student(`name`) values ('李四'); insert into student(`name`) values ('王五'); select * from student;
主鍵值也可以不連續(xù)
insert into student(id,`name`) values (100,'趙六'); select * from student;
還可以再插入100以下的數(shù)據(jù)。
insert into student(id,`name`) values (4,'王強(qiáng)'); select * from student;
下一次自增按照最大值自增。
insert into student(`name`) values ('李明');
一個表中不能包含多個主鍵
create table student( id bigint primary key, sno varchar(20) primary key, name varchar(20) not NULL );
一個主鍵可以包含多個列
create table student( sno varchar(20), `name` varchar(20), gender bool, primary key(sno,`name`) ); desc student;
多個主鍵列的值組合在一起,可以作為重復(fù)校驗的條件
insert into student(sno,`name`,gender) values ('1','張三',1); insert into student(sno,`name`,gender) values ('1','李四',1); insert into student(sno,`name`,gender) values ('1','張三',1);
七、FOREIGN KEY 外鍵約束
- 外鍵?于定義主表和從表之間的關(guān)系
- 外鍵約束主定義在從表的列上,主表關(guān)聯(lián)的列必須是主鍵或唯一約束
- 當(dāng)定義外鍵后,要求從表中的外鍵列數(shù)據(jù)必須在主表的主鍵或唯?列存在或為null。
之所以要使用外鍵,是因為外鍵可以更方便地維護(hù)數(shù)據(jù),比如上圖中班級編號就可以簡化為1個數(shù)字,又比如在填表過程中填到一半,系統(tǒng)出現(xiàn)了崩潰,導(dǎo)致數(shù)據(jù)不全。
外鍵約束也是對數(shù)據(jù)的一種校驗,從表中使用了主表中的某個值,這個值必須存在于主表中。
-- 創(chuàng)建班級表 create table class( id bigint primary key auto_increment, `name` varchar(20) not null ); insert into class (`name`) values ('1001'),('1002'),('1003'),('2001'),('2002'); select * from class;
-- 創(chuàng)建學(xué)生表 create table student( id bigint primary key auto_increment, `name` varchar(20) not null, age int, class_id bigint, foreign key (class_id) references class(id) ); desc student;
insert into student (`name`,age,class_id) values ('張三',18,1);
insert into student (`name`,age,class_id) values ('李四',18,6);
insert into student (`name`,age,class_id) values ('張三',18,1); insert into student (`name`,age,class_id) values ('李四',18,1); insert into student (`name`,age,class_id) values ('王五',19,2); insert into student (`name`,age,class_id) values ('趙六',17,3); insert into student (`name`,age,class_id) values ('錢七',17,3); delete from class where id = 3;
刪除主表時如果從表中有對從表的引用,則不被允許刪除。要非得刪除,就先得解除從表對主表的引用。
八、Check 約束
應(yīng)用于?個或多個列,用于限制列中可接受的數(shù)據(jù)值,從而確保數(shù)據(jù)的完整性和準(zhǔn)確性。
create table student( id bigint PRIMARY KEY auto_increment, `name` varchar(20) not null, age int DEFAULT 18, gender char(1), check (age >= 16), check(gender = '男' or gender = '女') ); desc student;
-- 正常插入數(shù)據(jù) insert into student (`name`,age,gender) values ('張三',17,'男'),('李四',19,'女'); select * from student;
-- 錯誤插入數(shù)據(jù) insert into student (`name`,age,gender) values ('王五',15,'男');
以上就是MySQL數(shù)據(jù)庫約束深入詳解的詳細(xì)內(nèi)容,更多關(guān)于MySQL數(shù)據(jù)庫約束的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Mysql大數(shù)據(jù)量查詢優(yōu)化思路詳析
這篇文章主要介紹了Mysql大數(shù)據(jù)量查詢優(yōu)化思路,Mysql大表查詢優(yōu)化,理論上千萬級別以下的數(shù)據(jù)量Mysql單表查詢性能處理都是可以的。下文我們就來看看具體得思路解析2022-01-01MySQL中聚合函數(shù)count的使用和性能優(yōu)化技巧
這篇文章主要介紹了Windows 10,MySQL版本是5.7.12-log環(huán)境下mysql中聚合函數(shù)count的使用和性能優(yōu)化,需要的朋友可以參考下2018-06-06