一文了解MYSQL三大范式和表約束
?? 一,什么是范式
范式簡言之就是,數(shù)據(jù)庫設計對數(shù)據(jù)的存儲性能,還有開發(fā)人員對數(shù)據(jù)的操作都有莫大的關系。所以建立科學的,規(guī)范的的數(shù)據(jù)庫是需要滿足一些規(guī)范的來優(yōu)化數(shù)據(jù)數(shù)據(jù)存儲方式
范式一共有六種,這里主要詳細介紹三大范式:
第一范式(1NF),第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又稱完美范式)。滿足最低要求的范式是第一范式(1NF)。在第一范式的基礎上進一步滿足更多規(guī)范要求的稱為第二范式(2NF),其余范式以次類推。一般說來,數(shù)據(jù)庫只需滿足第三范式(3NF)就行了
?? 二,三大范式的理解
1,第一范式(確保每列保持原子性)
首先第一范式是最基本的范式,而第一范式的合理遵循要按照系統(tǒng)的需求而定,第一范式也是為了確保每列保持原子性,如果數(shù)據(jù)庫表中的所有字段值都是不可分解的原子值,就說明該數(shù)據(jù)庫表滿足了第?范式。
例如:某些數(shù)據(jù)庫系統(tǒng)中需要用到“地址”這個屬性,本來直接將“地址”屬性設計成?個數(shù)據(jù)庫表的字段
2,第二范式(保證每列都和主鍵相關)
第?范式在第?范式的基礎之上更進?層。第?范式需要確保數(shù)據(jù)庫表中的每?列都和主鍵相關,而不能只與主鍵的某?部分相關(主要針對聯(lián)合主鍵)。也就是說在?個數(shù)據(jù)庫表中,?個表中只能保存?種數(shù)據(jù),不可以把多種數(shù)據(jù)
保存在同?張數(shù)據(jù)庫表中
例如:對于一張訂單表,應該只包括訂單信息,若第一張有數(shù)量信息,不符合第二范式,對于訂單數(shù)量應該單獨為一張表
3,第三范式(保證每列和主鍵直接相關,不能間接相關)
第三范式需要確保數(shù)據(jù)表中的每?列數(shù)據(jù)都和主鍵直接相關,而不能間接相關,即滿足第二范式前提,如果某一屬性依賴于其他非主鍵屬性,而其他非主鍵屬性又依賴于主鍵,那么這個屬性就是間接依賴于主鍵,這被稱作傳遞依賴于主屬性。 解釋就是一張表最多只存兩層同類型信息。
例如:在設計?個訂單數(shù)據(jù)表的時候,可以將客戶編號作為?個外鍵和訂單表建立相應的關系
4,表的關系
(1)一對一
一對一就是?個學生對應?個學號
(2)一對多
一對多是 ?個班級包含多個學生(用兩張表表示)
(3)多對多
?張表中的?條數(shù)據(jù)可以對應到另?張表的多條數(shù)據(jù)
??三,表的約束有哪些
??1,約束類型
表約束也是為了規(guī)范程序員正確使用表的,但表約束是預先設置的,設置之后就對所有插?和修改立即生效
? NOT NULL - 指示某列不能存儲 NULL 值。
?UNIQUE - 保證某列的每行必須有唯一的值。
?DEFAULT - 規(guī)定沒有給列賦值時的默認值。
?PRIMARY KEY - NOT NULL 和 UNIQUE 的結合。確保某列(或兩個列多個列的結合)有唯一標識,有助于更容易更快速地找到表中的一個特定的記錄。
?FOREIGN KEY - 保證一個表中的數(shù)據(jù)匹配另一個表中的值的參照完整性。
?CHECK - 保證列中的值符合指定的條件。對于MySQL數(shù)據(jù)庫,對CHECK子句進行分析,但是忽略CHECK子句
??2,表的約束
(1)非空約束:NOT NULL
創(chuàng)建的字段默認是可以為空的
而添加了非空約束之后,設置的字段就不能為空了。
語法
字段名 數(shù)據(jù)類型 NOT NULL
說明了某列不可以存儲空值
(2)主鍵約束:PRIMARY KEY
主鍵的特征:
1.主鍵可以由多個字段或單個字段組成
2. 主鍵不能為空且唯?
3. ?個表中只能有?個主鍵
獨立主鍵語法:
語法: 字段 字段類型 primary key
示例:
create table test4(id int primary key,name varchar(250));
獨立主鍵:該主鍵由一個字段組成,且該主鍵不能重復
聯(lián)合主鍵:多個字段組成的主鍵,因此字段不能重復
一個主鍵可以有多個字段,一張表只能有一個主鍵
聯(lián)合主鍵語法:
語法: primary key(字段1,字段2…)
示例: > create table test5( id int, name varchar(250), primary key(id,name) );
(3)唯一約束:UNIQUE
唯?約束就是對應字段的值是唯?的,不能重復,但一個表可以有多個唯一索引
語法:
字段名 數(shù)據(jù)類型 unique
示例:
CREATE TABLE student_unique (
id INT unique,
name VARCHAR(250)
);
? 唯一約束和主鍵約束區(qū)別(面試??迹?/p>
主鍵約束?個表只能有?個,?唯?約束可以有多個
主鍵約束不能有 null 值,?唯?約束可以有 null(唯?索引可以有多個 null)
(4)外鍵約束:FOREIGN KEY
外鍵用于關聯(lián)其他表的主鍵或唯?鍵
外鍵可以插入NULL,多個NULL,若外鍵指定了值,那這個值一定要有效,有效是這個值在主表存在了
語法:
foreign key (字段名) references 主表(列)
示例:
創(chuàng)建學生表student,?個學生對應?個班級,?個班級對應多個學生。使用id為主鍵,classes_id為外鍵,關聯(lián)班級表id
-- 重新設置學?表結構 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)默認值約束: DEFAULT
指定id列為主鍵
-- 重新設置學生表結構 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ù)對應字段不給值時,使用最大值+1
– 主鍵是 NOT NULL 和 UNIQUE 的結合,可以不用 NOT NULL
id INT PRIMARY KEY auto_increment
總結
到此這篇關于MYSQL三大范式和表約束的文章就介紹到這了,更多相關MYSQL三大范式和表約束內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
mysql自動備份多個數(shù)據(jù)庫的實現(xiàn)
本文主要介紹了mysql自動備份多個數(shù)據(jù)庫的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-07-07