一文了解MYSQL三大范式和表約束
?? 一,什么是范式
范式簡言之就是,數(shù)據(jù)庫設(shè)計(jì)對數(shù)據(jù)的存儲性能,還有開發(fā)人員對數(shù)據(jù)的操作都有莫大的關(guān)系。所以建立科學(xué)的,規(guī)范的的數(shù)據(jù)庫是需要滿足一些規(guī)范的來優(yōu)化數(shù)據(jù)數(shù)據(jù)存儲方式
范式一共有六種,這里主要詳細(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)(主要針對聯(lián)合主鍵)。也就是說在?個(gè)數(shù)據(jù)庫表中,?個(gè)表中只能保存?種數(shù)據(jù),不可以把多種數(shù)據(jù)
保存在同?張數(shù)據(jù)庫表中
例如:對于一張訂單表,應(yīng)該只包括訂單信息,若第一張有數(shù)量信息,不符合第二范式,對于訂單數(shù)量應(yīng)該單獨(dú)為一張表

3,第三范式(保證每列和主鍵直接相關(guān),不能間接相關(guān))
第三范式需要確保數(shù)據(jù)表中的每?列數(shù)據(jù)都和主鍵直接相關(guān),而不能間接相關(guān),即滿足第二范式前提,如果某一屬性依賴于其他非主鍵屬性,而其他非主鍵屬性又依賴于主鍵,那么這個(gè)屬性就是間接依賴于主鍵,這被稱作傳遞依賴于主屬性。 解釋就是一張表最多只存兩層同類型信息。
例如:在設(shè)計(jì)?個(gè)訂單數(shù)據(jù)表的時(shí)候,可以將客戶編號作為?個(gè)外鍵和訂單表建立相應(yīng)的關(guān)系

4,表的關(guān)系
(1)一對一
一對一就是?個(gè)學(xué)生對應(yīng)?個(gè)學(xué)號

(2)一對多
一對多是 ?個(gè)班級包含多個(gè)學(xué)生(用兩張表表示)

(3)多對多
?張表中的?條數(shù)據(jù)可以對應(yīng)到另?張表的多條數(shù)據(jù)

??三,表的約束有哪些
??1,約束類型
表約束也是為了規(guī)范程序員正確使用表的,但表約束是預(yù)先設(shè)置的,設(shè)置之后就對所有插?和修改立即生效
? NOT NULL - 指示某列不能存儲 NULL 值。
?UNIQUE - 保證某列的每行必須有唯一的值。
?DEFAULT - 規(guī)定沒有給列賦值時(shí)的默認(rèn)值。
?PRIMARY KEY - NOT NULL 和 UNIQUE 的結(jié)合。確保某列(或兩個(gè)列多個(gè)列的結(jié)合)有唯一標(biāo)識,有助于更容易更快速地找到表中的一個(gè)特定的記錄。
?FOREIGN KEY - 保證一個(gè)表中的數(shù)據(jù)匹配另一個(gè)表中的值的參照完整性。
?CHECK - 保證列中的值符合指定的條件。對于MySQL數(shù)據(jù)庫,對CHECK子句進(jìn)行分析,但是忽略CHECK子句

??2,表的約束
(1)非空約束:NOT NULL
創(chuàng)建的字段默認(rèn)是可以為空的

而添加了非空約束之后,設(shè)置的字段就不能為空了。
語法
字段名 數(shù)據(jù)類型 NOT NULL
說明了某列不可以存儲空值
(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
唯?約束就是對應(yīng)字段的值是唯?的,不能重復(fù),但一個(gè)表可以有多個(gè)唯一索引
語法:
字段名 數(shù)據(jù)類型 unique
示例:
CREATE TABLE student_unique (
id INT unique,
name VARCHAR(250)
);

? 唯一約束和主鍵約束區(qū)別(面試??迹?/p>
主鍵約束?個(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é)生對應(yīng)?個(gè)班級,?個(gè)班級對應(yīng)多個(gè)學(xué)生。使用id為主鍵,classes_id為外鍵,關(guān)聯(lián)班級表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) );
對于整數(shù)類型的主鍵,常配搭自增長auto_increment來使用。插入數(shù)據(jù)對應(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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL系列數(shù)據(jù)庫設(shè)計(jì)三范式教程示例
這篇文章主要為大家介紹了MySQL系列之?dāng)?shù)據(jù)庫設(shè)計(jì)三范式的教程示例講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-10-10
MySQL 有關(guān)MHA搭建與切換的幾個(gè)錯(cuò)誤log匯總
這篇文章主要介紹了MySQL 有關(guān)MHA搭建與切換的幾個(gè)錯(cuò)誤log匯總,幫助大家更好的理解和使用MySQL,感興趣的朋友可以了解下2020-12-12
MySQL數(shù)據(jù)庫?觸發(fā)器?trigger
這篇文章主要介紹了MySQL數(shù)據(jù)庫?觸發(fā)器?trigger,觸發(fā)器是一種特殊類型的存儲過程,觸發(fā)器通過事件進(jìn)行觸發(fā)而被執(zhí)行,可通過數(shù)據(jù)庫中的相關(guān)表實(shí)現(xiàn)級聯(lián)更改,保證數(shù)據(jù)安全,進(jìn)行安全校驗(yàn)2022-06-06
MySQL中json_extract()函數(shù)的使用實(shí)例
這篇文章主要介紹了MySQL中json_extract()函數(shù)的使用實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07
這篇文章主要介紹了MySql超長自動截?cái)鄬?shí)例詳解的相關(guān)資料,這里通過實(shí)例來說明如何實(shí)現(xiàn)自動截?cái)嗟墓δ埽枰呐笥芽梢詤⒖枷?/div> 2017-07-07
MyEclipse連接MySQL數(shù)據(jù)庫報(bào)錯(cuò)解決辦法
我們現(xiàn)在一般網(wǎng)站都是利用的MySQL數(shù)據(jù)庫搭建網(wǎng)站的,但是在網(wǎng)上看到很多網(wǎng)友吐槽數(shù)據(jù)庫連接不上的問題,現(xiàn)在我就結(jié)合相關(guān)資料向提出一些我個(gè)人的見解,希望對大家解決問題有幫助2014-01-01最新評論

