柚子快報(bào)激活碼778899分享:數(shù)據(jù)庫 MySQL —— 約束
柚子快報(bào)激活碼778899分享:數(shù)據(jù)庫 MySQL —— 約束
MySQL —— 約束
引言not nulluniqueprimary key —— 主鍵auto_increment復(fù)合主鍵
foreign key —— 外鍵插入數(shù)據(jù)刪除主表的數(shù)據(jù)
default
引言
在設(shè)計(jì)表的時(shí)候,有些列是必填項(xiàng)(如果用戶不填,那這個(gè)數(shù)據(jù)就沒有必要存進(jìn)數(shù)據(jù)庫),可能表的第一列就是編號(hào)需要能自動(dòng)幫我們排序(這樣可以減少用戶的填寫負(fù)擔(dān),也減少我們的工作量),又或者我們需要有些數(shù)據(jù)是不能重復(fù)填寫的(例如身份證號(hào),每一個(gè)人都是獨(dú)一無二的)等等… 這些需求其實(shí)都可以實(shí)現(xiàn),現(xiàn)在我們來學(xué)習(xí)數(shù)據(jù)庫是如何實(shí)現(xiàn)約束的。
not null
表示某一列是不能存儲(chǔ) null 值的,也就是這一列是必填項(xiàng):
格式:在你定義表的時(shí)候,在需要不為空的列旁邊加上 not null 即可
我們查看表結(jié)構(gòu)發(fā)現(xiàn) Null 那一列的 id 對應(yīng)的一行現(xiàn)實(shí) No ,說明定義成功,現(xiàn)在我們插入一個(gè) id 為 空的數(shù)據(jù)實(shí)驗(yàn)一下:
會(huì)發(fā)現(xiàn)不允許你插入 id 為空的數(shù)據(jù)。
unique
保證某列的每一行都有一個(gè)唯一值,即不可以在某列上出現(xiàn)重復(fù)的數(shù)據(jù)。
語法格式:在你定義表的時(shí)候,在需要的列旁邊加上 unique 即可
我們來查看表結(jié)構(gòu):
我們發(fā)現(xiàn) id 那一行的 Key 值被置為了 UNI ,說明 id 是唯一值,如果插入id 相同的數(shù)據(jù),數(shù)據(jù)庫會(huì)報(bào)錯(cuò):
null 是可以重復(fù)的,不受 unique 約束
primary key —— 主鍵
primary key(也被我們稱為主鍵) 是 not null 和 unique 的結(jié)合(即主鍵約束的列即是非空的也是唯一的),能確保某列(或者兩列及以上的列的組合) 有唯一的標(biāo)識(shí)。
我們可以使用 not null + unique (沒有順序之分)來創(chuàng)建主鍵:
Key 顯示 PRI 就是主鍵的意思。
當(dāng)然這里可以直接使用關(guān)鍵字 primary key 來定義主鍵 :
主鍵約束幫我們對非空和唯一值進(jìn)行了校驗(yàn),對于這個(gè)性能消耗來說,我們還是能接受的。
auto_increment
對于整數(shù)類型的主鍵,常配搭自增長auto_increment來使用。插入數(shù)據(jù)對應(yīng)字段不給值時(shí),數(shù)據(jù)庫使用最大值+1 對其進(jìn)行賦值
語法格式就是在主鍵后面加 auto_increment
我們查看表結(jié)構(gòu)可以看到 Extra 這個(gè)擴(kuò)展列表里出現(xiàn)了 auto_increment ,說明 id 這一列數(shù)據(jù)會(huì)自增,其實(shí)可以類比我們的excel 表格,現(xiàn)在給大家演示自增的現(xiàn)象:
數(shù)據(jù)庫會(huì)幫我們維護(hù)主鍵的增長,在插入的時(shí)候,找到目前的最大值,然后在這個(gè)基礎(chǔ)上 +1 即可。
我們在插入一個(gè)id 定義為 100 的數(shù)據(jù),然后再插入只有姓名的數(shù)據(jù),看看現(xiàn)象:
這里說明了主鍵可以是不連續(xù)的
現(xiàn)在我們清空 test 表中的所有數(shù)據(jù),如果我們第一個(gè)插入的數(shù)據(jù)的 id 值為 null ,數(shù)據(jù)庫其實(shí)也能幫我們插入進(jìn)去:
empty set 表示空集。
這個(gè) id 生成的數(shù)值是上次 id 的最大值加 1 。
現(xiàn)在我們來定義一個(gè)新的表,來試一下 第一個(gè)插入的數(shù)據(jù)的 id 值為 null:
如果是全新的表,插入第一個(gè)數(shù)據(jù)的主鍵值為 null,會(huì)自動(dòng)賦值為 1 如果后序還是插入主鍵值為 null 的數(shù)據(jù),數(shù)據(jù)庫會(huì)為其賦值為最大值加 1
復(fù)合主鍵
注意一個(gè)表中只能存在一個(gè)主鍵
但是一個(gè)主鍵可以同時(shí)包含很多個(gè)列,這就是復(fù)合主鍵
如何定義符合主鍵? 在創(chuàng)建表的時(shí)候,加上 primary key (列名,列名…)
通過查看表結(jié)構(gòu)可以看到兩個(gè)列被主鍵管理著:
復(fù)合主鍵在做非空校驗(yàn)的時(shí)候,所有被主鍵管理的列都不能被定義為空,但是在做唯一性檢驗(yàn)的時(shí)候,只有當(dāng)所有被主鍵管理的列的數(shù)值都相同時(shí),才不會(huì)被允許插入。
演示一下:
現(xiàn)在插入兩個(gè)數(shù)據(jù):
再插入主鍵值相同的張三數(shù)據(jù): 發(fā)現(xiàn)插入不了,因?yàn)?1, 張三 被主鍵唯一值校驗(yàn)發(fā)現(xiàn),無法插入
但是你可以插入,主鍵值不完全相同的張三數(shù)據(jù):
foreign key —— 外鍵
外鍵用于關(guān)聯(lián)其他表的主鍵或唯一鍵
舉個(gè)例子:
設(shè)置外鍵的語法格式:foreign key (字段名) references 主表(列)
foreign key 是外鍵的關(guān)鍵字,字段名是表實(shí)當(dāng)前表中哪個(gè)字段要與主表建立主外鍵關(guān)系,references 關(guān)鍵字,表實(shí)后面要引用哪個(gè)表中的哪個(gè)列。
演示:
create table class (
id int primary key comment '班級',
num int comment '人數(shù)'
);
create table student (
id bigint primary key comment '學(xué)號(hào)',
name varchar(50) comment '姓名',
class_id int comment '班級',
foreign key (class_id) references class(id)
);
注意被關(guān)聯(lián)的表要先創(chuàng)建好,然后才能創(chuàng)建與其構(gòu)建主外鍵關(guān)系的表
外鍵一定是關(guān)聯(lián)另一張表的主鍵的
插入數(shù)據(jù)
我們往 student 表中 插入 一個(gè)不存在的班級編號(hào)的數(shù)據(jù): 發(fā)現(xiàn)這是不能插入的
通過外鍵的約束,可以保證數(shù)據(jù)的完整性和關(guān)系的確定性。
刪除主表的數(shù)據(jù)
首先先確定 class 是主表,因?yàn)樗潜魂P(guān)聯(lián)的,student 是 子表
當(dāng)子表存在對主表依賴的數(shù)據(jù)的時(shí)候,不能刪除主表對應(yīng)的數(shù)據(jù) 因?yàn)?231 與子表存在關(guān)聯(lián),所以主表的 231 數(shù)據(jù)不能被刪除
但是可以刪除沒有關(guān)聯(lián)關(guān)系的數(shù)據(jù):
如果一定要?jiǎng)h除主表的存在關(guān)聯(lián)關(guān)系的數(shù)據(jù)的時(shí)候,那么子表就不能存在有數(shù)據(jù)行對其有依賴,所以先刪除子表的數(shù)據(jù)行解除關(guān)聯(lián)關(guān)系,再去刪除主表的數(shù)據(jù):
default
給沒有賦值的列 賦默認(rèn)值。
語法格式:在你定義表的時(shí)候,在指定的列旁邊加上 (default + 默認(rèn)值) 即可
查看表結(jié)構(gòu)發(fā)現(xiàn) Default 列表對應(yīng)的 name 出現(xiàn)了 默認(rèn)值為 無名氏,也就是當(dāng)你沒有填姓名的時(shí)候默認(rèn)值會(huì)默認(rèn)為 無名氏。
演示一下:
如果你有設(shè)置name 這個(gè)數(shù)值,那就不會(huì)賦默認(rèn)值
如果你沒有設(shè)置name 這個(gè)數(shù)值,就會(huì)賦默認(rèn)值——無名氏:
柚子快報(bào)激活碼778899分享:數(shù)據(jù)庫 MySQL —— 約束
參考閱讀
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。