主頁 > 知識庫 > MySQL中常見的六個約束類型詳解

MySQL中常見的六個約束類型詳解

熱門標(biāo)簽:臨清電話機器人 高清地圖標(biāo)注道路 話務(wù)外呼系統(tǒng)怎么樣 云南電商智能外呼系統(tǒng)價格 拉卡拉外呼系統(tǒng) 大眾點評星級酒店地圖標(biāo)注 外東北地圖標(biāo)注 400電話可以辦理嗎 智能外呼系統(tǒng)復(fù)位

前言

在向數(shù)據(jù)表中插入數(shù)據(jù)時,有的時候?qū)τ诓迦氲臄?shù)據(jù)是有特殊要求的,比如學(xué)生成績不能為空,學(xué)生學(xué)號不能重復(fù)等等,這個時候約束就派上用場了。

約束類型是通過對表的行或列的數(shù)據(jù)做出限制,來確保表的數(shù)據(jù)的完整性、唯一性。這一章我們主要介紹六個常見的MySQL約束類型。

1. not null

保證指定不能存儲NULL值,如果插入NULL則插入失敗。

我們定義兩張數(shù)據(jù)表,分別是student表和student_copy表,student表設(shè)定相關(guān)約束,student_copy表作為其對照表,不設(shè)置任何約束來觀察兩者的區(qū)別。

student表中id定義了not null,所以id這一行的NULL = NO,意思是這一行數(shù)據(jù)不能為NULL,否則會插入失敗。

student_copy表中沒有進行任何約束,所以任何字段的NULL = YES,意味著用戶可以隨意插入空值而不會報錯。

Q:not null約束下除了顯式的指定插入NULL會報錯外,隱式的NULL會報錯嗎?

NULL指定有兩種方式,分別是顯式和隱式。

顯式指的是插入時設(shè)定該列為NULL,而隱式指的是插入時對該列沒有賦值,而這一列又沒有指定默認(rèn)值,系統(tǒng)默認(rèn)的默認(rèn)值是NULL,所有這中情況下也會觸發(fā)插入控制的錯誤。

2. unique

保證某列的每行必須有唯一的值,也就是說,指定列的每行數(shù)據(jù)都不能重復(fù)。

下面兩張圖分別是對student表和student_copy表的操作,student表的id列設(shè)置了unique約束,所以在插入同樣的id = 1時會顯示重復(fù)操作。

student_copy表中沒有進行任何約束,意味著用戶可以隨意插入任意值而不會報錯。

Q:unique約束下插入NULL值會報錯嗎?

其實這個問題在剛才已經(jīng)操作過了,student表中插入id = NULL,系統(tǒng)并不會報錯。unique只是保證存儲的值唯一,它可以是空值,但空值也得唯一,再插入NULL就會報錯。

3. default

規(guī)定沒有給列賦值時的默認(rèn)值,換句話說就是,插入數(shù)據(jù)時沒有給指定列的值,那么其值就是defalut指定的默認(rèn)值。

student表指定了name字段設(shè)置了default約束之后,default這一列就有了名字。當(dāng)插入數(shù)據(jù)時,沒有指定name這一列,那么name這列就會按照我們設(shè)置的默認(rèn)值 = '未命名'來填充。

而student_copy表沒有設(shè)置default約束,所以當(dāng)插入數(shù)據(jù)時,沒有指定的列會按照系統(tǒng)默認(rèn)的默認(rèn)值來填充,也就是NULL。

4. primary key

not null + unique 的結(jié)合,保證某列具有唯一標(biāo)識且不能存儲NULL值。

前幾個約束類型都是可以同時給多個列設(shè)置的,但是primary key一張表中只有能約束一列,使用primary key約束的列被稱為主鍵。

和unique類型,插入的數(shù)據(jù)如果重復(fù)了,那么后一條數(shù)據(jù)會插入失敗,并且插入的數(shù)據(jù)不能為NULL。

一個表中只能由一列時主鍵,不能同時有多列是主鍵。設(shè)計表的時候,一般最好設(shè)定一個主鍵,常見的主鍵都是數(shù)字形式的。

自增主鍵auto_increment

在實際開發(fā)中,往往有一系列的策略來保證主鍵不重復(fù),最常見的方法就是設(shè)置自增主鍵,系統(tǒng)可以自動給數(shù)據(jù)分配,用戶也可以同時手動進行干預(yù),因為MySQL中內(nèi)置了自增主鍵功能,所以使用非常簡單.

下圖中id這一列就變成了自增主鍵,用戶在插入數(shù)據(jù)時,就可以不必手動干預(yù)了.

Q:執(zhí)行以下操作,猜想該表的查詢結(jié)果是什么?

已知Id字段設(shè)置為自增主鍵.

張三的id = null,由于自增主鍵按照順序它的id = 1;李四的id = 1,主鍵不能重復(fù),李四的id和張三的id重復(fù),所以插入失敗;繼續(xù)插入李四數(shù)據(jù),此時設(shè)置id = 4,沒有和原有數(shù)據(jù)重復(fù),所以插入成功;王五的id = null,按照自增主鍵接著上一個順序往下走,所以它的id = 5;

那么我們來看一下結(jié)果:

 

5. foreign key

外鍵用于關(guān)聯(lián)其他表的主鍵,保證一個表中的數(shù)據(jù)匹配另一個表中的值的參照完整性。

foreign key (字段名) references 主表(列)

下面我們舉個例子來理解下,我們現(xiàn)在創(chuàng)建兩張表并想把它們關(guān)聯(lián)起來,應(yīng)該如何操作呢?

首先思考一下這個對應(yīng)關(guān)系,一個學(xué)生對應(yīng)一個班級,一個班級對應(yīng)多個學(xué)生.在學(xué)生表中id為主鍵,那我們可以設(shè)置學(xué)生class_id為外鍵,去關(guān)聯(lián)比班級表.

創(chuàng)建班級表class,設(shè)置classsId為主鍵

create table class (
 id int primary key auto_increment,
 name varchar(20)
);

創(chuàng)建學(xué)生表student,設(shè)置id為主鍵

create table student (
 id int primary key auto_increment,
 name varchar(20),
 class_id int,
 foreign key (class_id) references class(id)
);

MUL表示外鍵約束;

外鍵的使用規(guī)則

學(xué)生表中的插入的班級Id,必須在班級表中存在;

班級表是空的,這個時候插入學(xué)生表數(shù)據(jù)并給class_id = 1,而班級號在班級表中是空的,所以插入失敗.學(xué)生表指定的這個外鍵約束,必須是班級表的主鍵;外鍵約束建立好了以后,此時班級表中的班級id就不能再隨意修改或刪除;

我們無法將班級表中id = 1的記錄修改為id = 20,因為學(xué)生表中的張三依賴于班級表id = 1這樣的結(jié)果.

外鍵的缺點

加入假如我們有下面這樣一個商品-訂單關(guān)聯(lián)的兩張表

此時我們可以使用訂單表中的商品id和商品表中的商品id建立外鍵約束,但是當(dāng)訂單表中有了一個商品Id為1的記錄時,就無法刪除商品表中的id = 1的記錄了,那么這個數(shù)據(jù)就會持久的存下去,但是商品不一定永久存在,很有可能就下架了,這就是外鍵在關(guān)聯(lián)某些表時的矛盾所在.

如果我們既希望擁有外鍵約束的校驗功能,同時也希望可以解決當(dāng)前的矛盾,那么我們可以進行邏輯刪除:給商品單獨添加一列,標(biāo)識數(shù)據(jù)是否有效,設(shè)定flag = 1表示記錄有效,flag = 0表示記錄無效.需要刪除的商品,可以直接把它的標(biāo)識改為0,邏輯上標(biāo)識已經(jīng)刪除了該商品,但實際上該數(shù)據(jù)還在表中存儲,并不是真正意義上的物理刪除.

6. check

保證列中的值符合指定的條件。

總結(jié)

到此這篇關(guān)于MySQL中常見的六個約束類型的文章就介紹到這了,更多相關(guān)MySQL常見約束類型內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • mysql完整性約束實例詳解
  • MySQL約束超詳解
  • MySQL約束類型及舉例介紹
  • 基于MySQL數(shù)據(jù)庫的數(shù)據(jù)約束實例及五種完整性約束介紹
  • MySQL學(xué)習(xí)之?dāng)?shù)據(jù)庫表五大約束詳解小白篇

標(biāo)簽:三明 無錫 福州 山西 阿里 揚州 定西 溫州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《MySQL中常見的六個約束類型詳解》,本文關(guān)鍵詞  MySQL,中,常見,的,六個,約束,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《MySQL中常見的六個約束類型詳解》相關(guān)的同類信息!
  • 本頁收集關(guān)于MySQL中常見的六個約束類型詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章