一文了解MYSQL三大范式和表約束
?? 一,什么是范式
范式簡(jiǎn)言之就是,數(shù)據(jù)庫設(shè)計(jì)對(duì)數(shù)據(jù)的存儲(chǔ)性能,還有開發(fā)人員對(duì)數(shù)據(jù)的操作都有莫大的關(guān)系。所以建立科學(xué)的,規(guī)范的的數(shù)據(jù)庫是需要滿足一些規(guī)范的來優(yōu)化數(shù)據(jù)數(shù)據(jù)存儲(chǔ)方式
范式一共有六種,這里主要詳細(xì)介紹三大范式:
第一范式(1NF),第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又稱完美范式)。滿足最低要求的范式是第一范式(1NF)。在第一范式的基礎(chǔ)上進(jìn)一步滿足更多規(guī)范要求的稱為第二范式(2NF),其余范式以次類推。一般說來,數(shù)據(jù)庫只需滿足第三范式(3NF)就行了
?? 二,三大范式的理解
1,第一范式(確保每列保持原子性)
首先第一范式是最基本的范式,而第一范式的合理遵循要按照系統(tǒng)的需求而定,第一范式也是為了確保每列保持原子性,如果數(shù)據(jù)庫表中的所有字段值都是不可分解的原子值,就說明該數(shù)據(jù)庫表滿足了第?范式。
例如:某些數(shù)據(jù)庫系統(tǒng)中需要用到“地址”這個(gè)屬性,本來直接將“地址”屬性設(shè)計(jì)成?個(gè)數(shù)據(jù)庫表的字段
2,第二范式(保證每列都和主鍵相關(guān))
第?范式在第?范式的基礎(chǔ)之上更進(jìn)?層。第?范式需要確保數(shù)據(jù)庫表中的每?列都和主鍵相關(guān),而不能只與主鍵的某?部分相關(guān)(主要針對(duì)聯(lián)合主鍵)。也就是說在?個(gè)數(shù)據(jù)庫表中,?個(gè)表中只能保存?種數(shù)據(jù),不可以把多種數(shù)據(jù)
保存在同?張數(shù)據(jù)庫表中
例如:對(duì)于一張訂單表,應(yīng)該只包括訂單信息,若第一張有數(shù)量信息,不符合第二范式,對(duì)于訂單數(shù)量應(yīng)該單獨(dú)為一張表
3,第三范式(保證每列和主鍵直接相關(guān),不能間接相關(guān))
第三范式需要確保數(shù)據(jù)表中的每?列數(shù)據(jù)都和主鍵直接相關(guān),而不能間接相關(guān),即滿足第二范式前提,如果某一屬性依賴于其他非主鍵屬性,而其他非主鍵屬性又依賴于主鍵,那么這個(gè)屬性就是間接依賴于主鍵,這被稱作傳遞依賴于主屬性。 解釋就是一張表最多只存兩層同類型信息。
例如:在設(shè)計(jì)?個(gè)訂單數(shù)據(jù)表的時(shí)候,可以將客戶編號(hào)作為?個(gè)外鍵和訂單表建立相應(yīng)的關(guān)系
4,表的關(guān)系
(1)一對(duì)一
一對(duì)一就是?個(gè)學(xué)生對(duì)應(yīng)?個(gè)學(xué)號(hào)
(2)一對(duì)多
一對(duì)多是 ?個(gè)班級(jí)包含多個(gè)學(xué)生(用兩張表表示)
(3)多對(duì)多
?張表中的?條數(shù)據(jù)可以對(duì)應(yīng)到另?張表的多條數(shù)據(jù)
??三,表的約束有哪些
??1,約束類型
表約束也是為了規(guī)范程序員正確使用表的,但表約束是預(yù)先設(shè)置的,設(shè)置之后就對(duì)所有插?和修改立即生效
? NOT NULL - 指示某列不能存儲(chǔ) NULL 值。
?UNIQUE - 保證某列的每行必須有唯一的值。
?DEFAULT - 規(guī)定沒有給列賦值時(shí)的默認(rèn)值。
?PRIMARY KEY - NOT NULL 和 UNIQUE 的結(jié)合。確保某列(或兩個(gè)列多個(gè)列的結(jié)合)有唯一標(biāo)識(shí),有助于更容易更快速地找到表中的一個(gè)特定的記錄。
?FOREIGN KEY - 保證一個(gè)表中的數(shù)據(jù)匹配另一個(gè)表中的值的參照完整性。
?CHECK - 保證列中的值符合指定的條件。對(duì)于MySQL數(shù)據(jù)庫,對(duì)CHECK子句進(jìn)行分析,但是忽略CHECK子句
??2,表的約束
(1)非空約束:NOT NULL
創(chuàng)建的字段默認(rèn)是可以為空的
而添加了非空約束之后,設(shè)置的字段就不能為空了。
語法
字段名 數(shù)據(jù)類型 NOT NULL
說明了某列不可以存儲(chǔ)空值
(2)主鍵約束:PRIMARY KEY
主鍵的特征:
1.主鍵可以由多個(gè)字段或單個(gè)字段組成
2. 主鍵不能為空且唯?
3. ?個(gè)表中只能有?個(gè)主鍵
獨(dú)立主鍵語法:
語法: 字段 字段類型 primary key
示例:
create table test4(id int primary key,name varchar(250));
獨(dú)立主鍵:該主鍵由一個(gè)字段組成,且該主鍵不能重復(fù)
聯(lián)合主鍵:多個(gè)字段組成的主鍵,因此字段不能重復(fù)
一個(gè)主鍵可以有多個(gè)字段,一張表只能有一個(gè)主鍵
聯(lián)合主鍵語法:
語法: primary key(字段1,字段2…)
示例: > create table test5( id int, name varchar(250), primary key(id,name) );
(3)唯一約束:UNIQUE
唯?約束就是對(duì)應(yīng)字段的值是唯?的,不能重復(fù),但一個(gè)表可以有多個(gè)唯一索引
語法:
字段名 數(shù)據(jù)類型 unique
示例:
CREATE TABLE student_unique (
id INT unique,
name VARCHAR(250)
);
? 唯一約束和主鍵約束區(qū)別(面試常考)
主鍵約束?個(gè)表只能有?個(gè),?唯?約束可以有多個(gè)
主鍵約束不能有 null 值,?唯?約束可以有 null(唯?索引可以有多個(gè) null)
(4)外鍵約束:FOREIGN KEY
外鍵用于關(guān)聯(lián)其他表的主鍵或唯?鍵
外鍵可以插入NULL,多個(gè)NULL,若外鍵指定了值,那這個(gè)值一定要有效,有效是這個(gè)值在主表存在了
語法:
foreign key (字段名) references 主表(列)
示例:
創(chuàng)建學(xué)生表student,?個(gè)學(xué)生對(duì)應(yīng)?個(gè)班級(jí),?個(gè)班級(jí)對(duì)應(yīng)多個(gè)學(xué)生。使用id為主鍵,classes_id為外鍵,關(guān)聯(lián)班級(jí)表id
-- 重新設(shè)置學(xué)?表結(jié)構(gòu) DROP TABLE IF EXISTS student; CREATE TABLE student ( id INT PRIMARY KEY auto_increment, sn INT UNIQUE, name VARCHAR(250) DEFAULT 'unkown', qq_mail VARCHAR(250), classes_id int, FOREIGN KEY (classes_id) REFERENCES classes(id) );
(5)默認(rèn)值約束: DEFAULT
指定id列為主鍵
-- 重新設(shè)置學(xué)生表結(jié)構(gòu) DROP TABLE IF EXISTS student; CREATE TABLE student ( id INT NOT NULL PRIMARY KEY, sn INT UNIQUE, name VARCHAR(20) DEFAULT 'unkown', qq_mail VARCHAR(20) );
對(duì)于整數(shù)類型的主鍵,常配搭自增長(zhǎng)auto_increment來使用。插入數(shù)據(jù)對(duì)應(yīng)字段不給值時(shí),使用最大值+1
– 主鍵是 NOT NULL 和 UNIQUE 的結(jié)合,可以不用 NOT NULL
id INT PRIMARY KEY auto_increment
總結(jié)
到此這篇關(guān)于MYSQL三大范式和表約束的文章就介紹到這了,更多相關(guān)MYSQL三大范式和表約束內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
k8s搭建mysql集群實(shí)現(xiàn)主從復(fù)制的方法步驟
本文是基于已有k8s環(huán)境下,介紹在k8s環(huán)境中部署mysql主從集群的實(shí)現(xiàn)步驟,對(duì)mysql學(xué)習(xí)有一定的幫助,感興趣的可以學(xué)習(xí)一下2023-01-01關(guān)于MySQL自增ID的一些小問題總結(jié)
這篇文章主要給大家總結(jié)介紹了關(guān)于MySQL自增ID的一些小問題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用MySQL具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11mysql自動(dòng)備份多個(gè)數(shù)據(jù)庫的實(shí)現(xiàn)
本文主要介紹了mysql自動(dòng)備份多個(gè)數(shù)據(jù)庫的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07InnoDB實(shí)現(xiàn)序列化隔離級(jí)別的方法
這篇文章主要介紹了InnoDB實(shí)現(xiàn)序列化隔離級(jí)別的方法,文中介紹的非常詳細(xì),相信對(duì)大家學(xué)習(xí)或者使用InnoDB具有一定的參考價(jià)值,需要的朋友們可以參考學(xué)習(xí),下面來一起看看吧。2017-04-04mysql修改sql_mode報(bào)錯(cuò)的解決
今天在Navicat中運(yùn)行sql語句創(chuàng)建數(shù)據(jù)表出現(xiàn)了錯(cuò)誤Err 1067。本文主要介紹了mysql修改sql_mode報(bào)錯(cuò)的解決,感興趣的可以了解一下2021-09-09Ubuntu安裝Mysql+啟用遠(yuǎn)程連接的完整過程
這篇文章主要介紹了Ubuntu如何安裝Mysql+啟用遠(yuǎn)程連接,用ssh客戶端或者云服務(wù)器廠家提供的網(wǎng)頁版控制臺(tái)都行,只要你能連上服務(wù)器就行,需要的朋友可以參考下2022-06-06