mysql的約束及實(shí)例分析
表的約束
為什么要有約束?
我們?cè)谑占恍?shù)據(jù)的時(shí)候會(huì)要求該數(shù)據(jù)必須存在
比如說(shuō)像是國(guó)家在登記公民信息的時(shí)候身份證一欄是必須要填寫(xiě)的不能為空
真正約束字段的是數(shù)據(jù)類型,但是數(shù)據(jù)類型約束很單一,需要有一些額外的約束,更好的保證數(shù)據(jù)的合 法性,從業(yè)務(wù)邏輯角度保證數(shù)據(jù)的正確性。比如有一個(gè)字段是email,要求是唯一的
表的約束很多,這里主要介紹如下幾個(gè): null/not null,default, comment, zerofill,primary key,auto_increment,unique key 。
空屬性
數(shù)據(jù)庫(kù)默認(rèn)字段基本都是字段為空,但是實(shí)際開(kāi)發(fā)時(shí),盡可能保證字段不為空,因?yàn)閿?shù)據(jù)為空沒(méi)辦法參與運(yùn)算
所以說(shuō)對(duì)于一些屬性我們要設(shè)置為非空
語(yǔ)法
not null
實(shí)例
我們這里創(chuàng)建一個(gè)班級(jí)表 其中包含班級(jí)名和所在的教室
在外面正常的邏輯中 班級(jí)和教室都是不能為空的
如果班級(jí)名為空我們就不知道自己在哪個(gè)班如果教室為空我們就不知道自己在哪個(gè)教室
所以說(shuō)我們?cè)谠O(shè)計(jì)數(shù)據(jù)表的時(shí)候加上非空約束

默認(rèn)值
默認(rèn)值:某一種數(shù)據(jù)會(huì)經(jīng)常性的出現(xiàn)某個(gè)具體的值,可以在一開(kāi)始就指定好,在需要真實(shí)數(shù)據(jù)的時(shí)候, 用戶可以選擇性的使用默認(rèn)值。
語(yǔ)法
default xxx

我們插入一個(gè)數(shù)據(jù)嘗試

我們這里只插入了值z(mì)hangsna但是age和sex都自動(dòng)填寫(xiě)了
有了default之后還需要設(shè)置非空嘛?
不需要 因?yàn)槿绻覀儧](méi)有填值的話 系統(tǒng)會(huì)給我們填上默認(rèn)值 所以說(shuō)就不存在空值的情況了
列描述
列描述:comment,沒(méi)有實(shí)際含義,專門用來(lái)描述字段,會(huì)根據(jù)表創(chuàng)建語(yǔ)句保存,用來(lái)給程序員或DBA來(lái)進(jìn)行了解。
語(yǔ)法
comment ‘xxx'
此外我們可以通過(guò)查看創(chuàng)建語(yǔ)句來(lái)看到對(duì)于每個(gè)列的描述
實(shí)例

zerofill
剛開(kāi)始學(xué)習(xí)數(shù)據(jù)庫(kù)時(shí),很多人對(duì)數(shù)字類型后面的長(zhǎng)度很迷茫
比如說(shuō)在下圖中 int類型后面的11是什么意思呢?

整型不是4字節(jié)碼?這個(gè)10又代表什么呢?其實(shí)沒(méi)有zerofill這個(gè)屬性,括號(hào)內(nèi)的數(shù)字是毫無(wú)意義的
此時(shí)我們修改t8中age類型的屬性 在后面加上zerofill

此時(shí)我們發(fā)現(xiàn)age的18前面補(bǔ)上了三個(gè)0
也就是說(shuō)zerofill的意義其實(shí)是看該類型有沒(méi)有達(dá)到指定的位數(shù) 如果沒(méi)有達(dá)到就在前面加上0填充
主鍵
主鍵:primary key用來(lái)唯一的約束該字段里面的數(shù)據(jù),不能重復(fù),不能為空,一張表中最多只能有一個(gè)主鍵;主鍵所在的列通常是整數(shù)類型。
語(yǔ)法
primary key
實(shí)例
我們創(chuàng)建一張表 id作為主鍵 name作為非空列

主鍵約束
主鍵中的值不能重復(fù) 一旦重復(fù)就會(huì)報(bào)錯(cuò) 下面是示例

我們可以看到插入重復(fù)id時(shí)sql直接報(bào)錯(cuò)了
刪除主鍵
語(yǔ)法
alter table 表名 drop primary key;

添加主鍵
語(yǔ)法
alter table 表名 add primary key(字段列表)

復(fù)合主鍵
在創(chuàng)建表的時(shí)候,在所有字段之后,使用primary key(主鍵字段列表)來(lái)創(chuàng)建主鍵,如果有多個(gè)字段 作為主鍵,可以使用復(fù)合主鍵
比如說(shuō)在創(chuàng)建學(xué)生的課程表的時(shí)候?qū)W生id和課程號(hào)都是可以重復(fù)的 但是學(xué)生id和課程號(hào)的組合確是不能重復(fù)的 所以說(shuō)我們要將他們?cè)O(shè)置為復(fù)合主鍵
語(yǔ)法
primary key(xxx , yyy)

自增長(zhǎng)
auto_increment:當(dāng)對(duì)應(yīng)的字段,不給值,會(huì)自動(dòng)的被系統(tǒng)觸發(fā),系統(tǒng)會(huì)從當(dāng)前字段中已經(jīng)有的最大值+1操作,得到一個(gè)新的不同的值。通常和主鍵搭配使用,作為邏輯主鍵。
自增長(zhǎng)的特點(diǎn):
任何一個(gè)字段要做自增長(zhǎng),前提是本身是一個(gè)索引(key一欄有值)自增長(zhǎng)字段必須是整數(shù)一張表最多只能有一個(gè)自增長(zhǎng)
語(yǔ)法:
auto_increment
下面是實(shí)例

我們開(kāi)始插入名字 之后查看id的變化情況

我們發(fā)現(xiàn)id數(shù)據(jù)是從1開(kāi)始依次往后遞增
那么如果我們現(xiàn)在插入一個(gè)id為1000的數(shù)據(jù)之后的id會(huì)如何變化呢?

我們可以發(fā)現(xiàn)后面的id從1001開(kāi)始自增了
唯一鍵
在了解唯一鍵之前我們首先要明白一個(gè)概念
并不是因?yàn)槲覀冞x擇一個(gè)屬性成為了主鍵這個(gè)屬性才具有了唯一性 而是我們選擇了一個(gè)具有唯一性的屬性成為了主鍵
也就是說(shuō)除了主鍵之間還有很多數(shù)據(jù)也可能具有唯一性 這也就是我們唯一鍵出現(xiàn)的原因
語(yǔ)法
unique
下面是實(shí)例

當(dāng)一個(gè)數(shù)據(jù)成為唯一鍵之后那么這個(gè)數(shù)據(jù)就不能重復(fù)了
外鍵
外鍵用于定義主表和從表之間的關(guān)系:外鍵約束主要定義在從表上,主表則必須是有主鍵約束或unique約束。
當(dāng)定義外鍵后,要求外鍵列數(shù)據(jù)必須在主表的主鍵列存在或?yàn)閚ull。
我們先來(lái)看最后一句加粗的話 也就是說(shuō)主表中必須有數(shù)據(jù)從表中才能插入數(shù)據(jù)
語(yǔ)法:
foreign key (class_id) references myclass(id)
下面是實(shí)例 我們先創(chuàng)建主表 之后再?gòu)谋碇袆?chuàng)建外鍵約束


我們首先像從表中插入數(shù)據(jù)嘗試

我們可以發(fā)現(xiàn)主表中如果沒(méi)有插入數(shù)據(jù)從表中是不能插入的

而主表中有數(shù)據(jù) 從表中就可以插入數(shù)據(jù)了

而我們刪除數(shù)據(jù)的時(shí)候必須要先刪除從表中的數(shù)據(jù)才能刪除主表
這里總結(jié)下
外鍵是在從表中定義的從表添加數(shù)據(jù)必須主表先添加主表刪除數(shù)據(jù)必須從表先刪除
我們?nèi)绾卫斫馔怄I約束
首先這是一種約束 它肯定是為了防止我們做出錯(cuò)誤或不符合邏輯的操作的
理論上,上面的例子,我們不創(chuàng)建外鍵約束,就正常建立學(xué)生表,以及班級(jí)表,該有的字段我們都有。
但是實(shí)際過(guò)程中由于可能會(huì)由于人為操作的失誤而造成一些錯(cuò)誤 比如說(shuō)一些數(shù)據(jù)只有學(xué)生表中有 而不存在于班級(jí)表中(這樣就不知道這個(gè)學(xué)生在哪個(gè)班了)
所以說(shuō)我們添加外鍵約束是必須的 它的本質(zhì)其實(shí)就是將插入和刪除數(shù)據(jù)的合法性交給mysql去審核
總結(jié)

到此這篇關(guān)于mysql的約束及實(shí)例分析的文章就介紹到這了,更多相關(guān)mysql的約束內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL服務(wù)無(wú)法啟動(dòng)且服務(wù)沒(méi)有報(bào)告任何錯(cuò)誤解決辦法
這篇文章主要介紹了MySQL服務(wù)無(wú)法啟動(dòng)且服務(wù)沒(méi)有報(bào)告任何錯(cuò)誤解決辦法,MySQL啟動(dòng)不了可能是由于配置錯(cuò)誤、服務(wù)未啟動(dòng)、端口被占用等原因造成的,文中介紹的非常詳細(xì),需要的朋友可以參考下2024-10-10
MySQL使用mysqldump+binlog完整恢復(fù)被刪除的數(shù)據(jù)庫(kù)原理解析
這篇文章主要介紹了MySQL使用mysqldump+binlog完整恢復(fù)被刪除的數(shù)據(jù)庫(kù),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04
解決mysql安裝時(shí)出現(xiàn)error Nr.1045問(wèn)題的方法
這篇文章主要為大家詳細(xì)介紹了解決mysql安裝時(shí)出現(xiàn)error Nr.1045問(wèn)題的方法,感興趣的小伙伴們可以參考一下2016-06-06
Mysql單文件存儲(chǔ)刪除數(shù)據(jù)文件容量不會(huì)減少的bug與解決方法
這篇文章主要給大家介紹了Mysql單文件存儲(chǔ)刪除數(shù)據(jù)文件時(shí)容量不會(huì)減少的bug與解決方法,文中給出了詳細(xì)的解決方法,相信對(duì)遇到這個(gè)問(wèn)題的朋友們能帶來(lái)一定的幫助,下面來(lái)一起看看吧。2016-12-12
Mysql默認(rèn)設(shè)置的危險(xiǎn)性分析
一.mysql默認(rèn)的授權(quán)表二.缺乏日志能力 三.my.ini文件泄露口令 四.服務(wù)默認(rèn)被綁定全部的網(wǎng)絡(luò)接口上 五.默認(rèn)安裝路徑下的mysql目錄權(quán)限2008-09-09
MySQL中的datediff()方法和timestampdiff()方法的應(yīng)用示例小結(jié)
在MySQL中,DATEDIFF()函數(shù)和TIMESTAMPDIFF()函數(shù)用于計(jì)算日期和時(shí)間之間的差異,TIMESTAMPDIFF()函數(shù)返回的結(jié)果是整數(shù),但你可以通過(guò)在計(jì)算過(guò)程中使用適當(dāng)?shù)某▉?lái)獲得所需的小數(shù)部分,本文介紹MySQL中的datediff()方法和timestampdiff()方法的應(yīng)用,感興趣的朋友一起看看吧2023-12-12

