MySQL?數(shù)據(jù)庫(kù)的約束及數(shù)據(jù)表的設(shè)計(jì)原理
1. 數(shù)據(jù)庫(kù)的約束
1.1 介紹
數(shù)據(jù)庫(kù)中的約束 ,顧名思義即是對(duì)插入數(shù)據(jù)庫(kù)中的數(shù)據(jù)進(jìn)行限定,這么做的目的是為了保證數(shù)據(jù)的有效性和完整性。 這樣就大幅度地提高了數(shù)據(jù)庫(kù)中數(shù)據(jù)的質(zhì)量,節(jié)省了數(shù)據(jù)庫(kù)的空間和調(diào)用數(shù)據(jù)的時(shí)間。
之前介紹過(guò) MySQL 中的數(shù)據(jù)類型,數(shù)據(jù)類型其實(shí)就能夠?qū)σ徊糠謹(jǐn)?shù)據(jù)進(jìn)行校驗(yàn)。約束也一樣,同樣能夠?qū)σ恍?shù)據(jù)進(jìn)行校驗(yàn)工作。這樣就可以盡量避免出現(xiàn)一些非法的數(shù)據(jù)
1.2 約束類型
常見(jiàn)約束的類型有以下幾種:
not null
: 指示某列不能存儲(chǔ) null 值unique
: 保證某列的每行必須是唯一值,不能有重復(fù)default
: 規(guī)定沒(méi)有給列賦值時(shí)的默認(rèn)值primary key
: 表示主鍵,是not null
和unique
的結(jié)合。確保某列(或多個(gè)列的結(jié)合)有唯一標(biāo)識(shí),有助于更容易更快速的找到表中的一個(gè)特定的記錄foreign key
: 保證一個(gè)表中的數(shù)據(jù)匹配另一個(gè)表中的值的參照完整性check
: 保證列中的值符合指定的條件。對(duì)于 MySQL 數(shù)據(jù)庫(kù),可以使用 check,但是其使用結(jié)果忽略
1.3 not null
如果不使用 not null
,即表示默認(rèn)情況下可以插入 null
(即這列的值可以不填)
但是例如做一些調(diào)查問(wèn)卷時(shí),就有必填項(xiàng),此時(shí)這些選項(xiàng)就不能為空,就可以使用 not null
示例:
1.4 unique
如果不使用 unique
,那么某列不同行的值是可以重復(fù)的。
但實(shí)際生活中,例如身份證號(hào)碼、電話號(hào)碼等等其實(shí)是一個(gè)唯一值,此時(shí)就可以使用 unique
示例:
注意:
當(dāng)列有 unique
約束時(shí),進(jìn)入插入前,就先會(huì)查找,如果要插入的值不存在,才會(huì)進(jìn)行插入,因此使用 unique 其實(shí)會(huì)影響效率,但總的來(lái)說(shuō)利大于弊。
1.5 default
當(dāng)我們不使用 default
去指定列的默認(rèn)值時(shí),該默認(rèn)值就為 null,如果你想改變某列的默認(rèn)值,就可以使用 default
示例:
1.6 primary key
primary key
是主鍵,表示了一個(gè)記錄的身份標(biāo)識(shí),相當(dāng)于同時(shí)使用 not null 和 unique
示例:
注意:
- 一張表中只能有一個(gè)主鍵
- 主鍵可以由多個(gè)列聯(lián)合形成
補(bǔ)充: 自動(dòng)增量 —— auto_increment
MySQL 可以自動(dòng)的為每個(gè)行分配下一個(gè)可用的編號(hào),不用在添加一行時(shí)手動(dòng)分配唯一值(可以手動(dòng)分配唯一值)。但是必須用在 create 創(chuàng)建表的時(shí)候,例如:
注意:當(dāng)使用自動(dòng)增量和手動(dòng)分配混搭時(shí),這個(gè)唯一值就不一定是有序的了
1.7 foreign key
foreign key
是外鍵約束,可用于關(guān)聯(lián)其它表的主鍵或唯一值
例如淘寶購(gòu)物的話,一個(gè)數(shù)據(jù)庫(kù)中可以有商品表和訂單表兩個(gè)數(shù)據(jù)表,而這兩個(gè)表都可以包含商品編號(hào)。而訂單表里面的商品編號(hào)一定是商品表里面有的前提下才可以出現(xiàn)。因此就可以使用外鍵來(lái)約束,防止非正常數(shù)據(jù)出現(xiàn)
示例:
作用:
外鍵約束將兩張表綁定起來(lái),其中被約束的表可以叫做子表,約束別人的表叫做父表,如果子表中的列要插入的值在父表中關(guān)聯(lián)的主鍵或唯一值中沒(méi)有,那么將插入將會(huì)失敗
注意: 外鍵約束會(huì)導(dǎo)致父表中的記錄不能直接刪,那么想要?jiǎng)h除父表的記錄該怎么做呢?(例如要下架某個(gè)商品,該商品的編號(hào)也就沒(méi)了)
解決思路: 邏輯刪除(不直接刪除數(shù)據(jù)庫(kù)的記錄,沒(méi)有打破外鍵約束)
在商品表中引入一個(gè)新的字段,通過(guò)這個(gè)字段表示該記錄是有效還是無(wú)效的??梢粤钸@個(gè)字段默認(rèn)值為1,即表示有效,如果要?jiǎng)h除這個(gè)商品,就把這個(gè)字段改為0,此時(shí)該商品就無(wú)效了。
1.8 check
check
約束是可以指定某列可以填入的數(shù)據(jù),例如性別,就只能填入男或者女
注意:
MySQL 中現(xiàn)在還不支持該約束,即使用了,也會(huì)忽略該約束的影響
示例:
2. 數(shù)據(jù)庫(kù)表的設(shè)計(jì)
當(dāng)我們掌握了基本的數(shù)據(jù)庫(kù)的操作方法后,如果我們要面對(duì)一個(gè)從零開(kāi)始建表的操作,勢(shì)必要對(duì)我們需要的實(shí)體和它們之間的關(guān)系有一個(gè)很好的把握。
實(shí)體之間的關(guān)系主要存在以下四種:
- 無(wú)關(guān)系
- 一對(duì)一關(guān)系
- 一對(duì)多關(guān)系
- 多對(duì)多關(guān)系
2.1 一對(duì)一關(guān)系
例如一個(gè)學(xué)生對(duì)應(yīng)著有一個(gè)系統(tǒng)的用戶身份,我們就可以有兩種設(shè)計(jì)方式
將學(xué)生信息和用戶信息放到一個(gè)表中
學(xué)號(hào) | 學(xué)生姓名 | 用戶名 | 用戶密碼 |
---|---|---|---|
2001 | 張三 | 三娃 | *** |
2002 | 李四 | 四娃 | *** |
2003 | 王五 | 五娃 | *** |
將學(xué)生放到 A 表中,用戶信息放到 B 表中,在 B 表中可以插入學(xué)生學(xué)號(hào)來(lái)將學(xué)生和用戶進(jìn)行關(guān)聯(lián)
A 表:
學(xué)號(hào) | 學(xué)生姓名 |
---|---|
2001 | 張三 |
2002 | 李四 |
2003 | 王五 |
B 表:
用戶名 | 用戶密碼 | 學(xué)生學(xué)號(hào) |
---|---|---|
三娃 | *** | 2001 |
四娃 | *** | 2002 |
五娃 | *** | 2003 |
2.2 一對(duì)多關(guān)系
例如一般一個(gè)中學(xué)學(xué)生和班級(jí)之間是一對(duì)多的關(guān)系,一個(gè)學(xué)生只能有一個(gè)班級(jí),一個(gè)班級(jí)里面可以有多個(gè)學(xué)生。
我們通常可以設(shè)計(jì)兩張表,存放學(xué)生信息的 A 表,和班級(jí)信息的 B 表,在學(xué)生信息中添加班級(jí)來(lái)進(jìn)行關(guān)聯(lián)
A表:
學(xué)號(hào) | 學(xué)生姓名 | 班級(jí)id |
---|---|---|
2001 | 張三 | 1 |
2002 | 李四 | 1 |
2003 | 王五 | 2 |
B 表:
班級(jí)id | 班級(jí)名稱 |
---|---|
1 | 高三(1)班 |
2 | 高三(2)班 |
2.3 多對(duì)多關(guān)系
例如大學(xué)生和課程之間,就是一個(gè)多對(duì)多的關(guān)系,一個(gè)學(xué)生可能有不同的多個(gè)課程,一個(gè)課程也有很多個(gè)學(xué)生來(lái)選擇。
這時(shí)我們?cè)O(shè)計(jì)三個(gè)表,分別為存放學(xué)生信息的 A 表、存放課程信息的 B 表和將學(xué)生與課程聯(lián)系起來(lái)的中間表 C 表
A表:
學(xué)號(hào) | 學(xué)生姓名 |
---|---|
2001 | 張三 |
2002 | 李四 |
2003 | 王五 |
B 表:
課程id | 課程名 |
---|---|
1 | 高等數(shù)學(xué) |
2 | 大學(xué)物理 |
3 | 數(shù)據(jù)庫(kù)理論 |
C 表:
學(xué)號(hào) | 課程id |
---|---|
2001 | 1 |
2001 | 2 |
2002 | 1 |
2002 | 3 |
2003 | 1 |
到此這篇關(guān)于MySQL 數(shù)據(jù)庫(kù)的約束及數(shù)據(jù)表的設(shè)計(jì)原理的文章就介紹到這了,更多相關(guān)MySQL 數(shù)據(jù)庫(kù)的約束及數(shù)據(jù)表設(shè)計(jì)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 淺談關(guān)系型數(shù)據(jù)庫(kù)中的約束及應(yīng)用場(chǎng)景
- MySQL數(shù)據(jù)庫(kù)表中的約束詳解
- MySQL數(shù)據(jù)庫(kù)的約束使用實(shí)例
- MySQL數(shù)據(jù)庫(kù)約束操作示例講解
- 一文理解MySQL數(shù)據(jù)庫(kù)的約束與表的設(shè)計(jì)
- SQL?Server數(shù)據(jù)庫(kù)創(chuàng)建表及其約束條件的操作方法
- MySQL數(shù)據(jù)庫(kù)的約束限制詳解
- MySQL數(shù)據(jù)庫(kù)表約束講解
- MySQL示例講解數(shù)據(jù)庫(kù)約束以及表的設(shè)計(jì)
- MySQL數(shù)據(jù)庫(kù)如何給表設(shè)置約束詳解
- Mysql關(guān)于數(shù)據(jù)庫(kù)是否應(yīng)該使用外鍵約束詳解說(shuō)明
- 深入理解數(shù)據(jù)庫(kù)之表的唯一、自增等七大約束
相關(guān)文章
MYSQL速度慢的問(wèn)題 記錄數(shù)據(jù)庫(kù)語(yǔ)句
Web程序慢,首先的一個(gè)檢測(cè)對(duì)象就是數(shù)據(jù)庫(kù),寫(xiě)過(guò)幾年程序的都知道?,F(xiàn)在想追蹤MySQL中那些拖累服務(wù)器性能的SQL語(yǔ)句,怎么辦2012-06-06數(shù)據(jù)庫(kù)報(bào)錯(cuò):Unknown column 'xxx' in
但凡寫(xiě)過(guò)sql語(yǔ)句的人估計(jì)都曾經(jīng)碰到過(guò)類似于Unknown column ‘xxx’ in ‘where clause’的問(wèn)題,這篇文章主要給大家介紹了關(guān)于數(shù)據(jù)庫(kù)報(bào)錯(cuò):Unknown column 'xxx' in 'where clause'問(wèn)題的解決過(guò)程,需要的朋友可以參考下2023-03-03mysql alter table命令修改表結(jié)構(gòu)實(shí)例
這篇文章主要介紹了mysql alter table命令修改表結(jié)構(gòu)實(shí)例的相關(guān)資料,需要的朋友可以參考下2016-10-10Ubuntu 18.04配置mysql以及配置遠(yuǎn)程連接的步驟
這篇文章主要給大家介紹了關(guān)于Ubuntu 18.04配置mysql以及配置遠(yuǎn)程連接的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-07-07