欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL中關(guān)于表的約束

 更新時間:2024年09月29日 09:45:04   作者:hu_143  
在MySQL中,約束用于定義表的規(guī)則和限制,確保數(shù)據(jù)的準(zhǔn)確性和可靠性,主要類型包括NOT NULL、DEFAULT、PRIMARY KEY、AUTO_INCREMENT、UNIQUE KEY、FOREIGN KEY、CHECK和INDEX等,NOT NULL約束確保列不能存儲NULL值;DEFAULT設(shè)置默認(rèn)值

一、空屬性

在MySQL中,空屬性約束指定了某一列是否可以包含NULL值。

它們用于各種目的,例如數(shù)據(jù)驗(yàn)證和限制數(shù)據(jù)的輸入格式。

  • NOT NULL:當(dāng)使用NOT NULL屬性約束時,將禁止該列包含NULL值。這意味著在插入或者更新數(shù)據(jù)時,該列必須包含有效的數(shù)值或字符,不能為NULL。
  • NULL:如果沒有顯式地指定NULL或NOT NULL屬性約束,那么默認(rèn)情況下,列可以包含NULL值。這意味著在插入或更新數(shù)據(jù)時,如果沒有提供有效的值,可以將該列的值設(shè)置為NULL。

如上圖所示,我們把id 和 name 均設(shè)置了 not null(不為空)。

其中并沒有對high設(shè)置,默認(rèn)就是可以為空的。

我們再插入數(shù)據(jù)進(jìn)行查看,如下:

從上圖中可以看到,當(dāng)對字段設(shè)置了不能為空時,插入的時候就不能再插入NULL值。當(dāng)可以為空時,插入NULL值和其對應(yīng)的類型的值均為可以的。

在實(shí)際應(yīng)用開發(fā)中,比如我們在插入數(shù)據(jù)并不能準(zhǔn)確的知道數(shù)據(jù)的值,就可以暫時插入NULL值。當(dāng)設(shè)置了不能為空時,這就約束著必須插入有效的值。

通過合理地應(yīng)用空屬性約束,可以有效地避免數(shù)據(jù)中的空值或缺失值,從而提高數(shù)據(jù)質(zhì)量和可靠性。

二、默認(rèn)值

在MySQL中,默認(rèn)值約束用于定義表列的默認(rèn)值。當(dāng)插入新記錄時,如果沒有為該列提供值,則可以使用默認(rèn)值來填充該列。這有助于減少數(shù)據(jù)冗余并提高數(shù)據(jù)庫的一致性。

當(dāng)某一種數(shù)據(jù)會經(jīng)常性的出現(xiàn)某個具體的值,可以在一開始就指定好,在需要真實(shí)數(shù)據(jù)的時候,用戶可以選擇性的使用默認(rèn)值。

下面我們看一個具體的實(shí)例:

在上圖中我們將性別默認(rèn)設(shè)置成 ‘女’。

當(dāng)插入數(shù)據(jù)時不提插入性別時,默認(rèn)就是 ‘女’。

具體如下圖:

通過上圖看到,當(dāng)我們不再插入性別時默認(rèn)給我們填充了‘女’,當(dāng)然也可以自己指定。

我們也可查看表結(jié)構(gòu),看其詳細(xì)的默認(rèn)值,如下圖:

當(dāng)我們不指定其默認(rèn)值時,默認(rèn)給我們指定了默認(rèn)值為NULL。

我們再看如下的插入:

假如設(shè)置一個字段不為空時,默認(rèn)值還會自動設(shè)置為NULL嗎?

我們不妨通過下圖看一下:

那么 default約束 和 空屬性約束 是不是沖突的呢?

當(dāng)我們設(shè)置了default時,這就意味著即使我們不插入數(shù)據(jù)也不為空,因?yàn)闀J(rèn)使用默認(rèn)值填充

default約束和not null約束同時出現(xiàn)并沒有太大的意義。因?yàn)橐坏O(shè)置的default約束,就可以保證了 not null 約束。

但是我們要區(qū)分的是:

  • default 是我們不顯示的向指定列插入,default會自動插入。
  • NULL 是顯示的向一列插入。如果插入正常值,就正常工作。如果不確定就插入NULL。但是有not null約束時,就必須插入有效值。

其實(shí)他們之前也并不沖突,反而是相輔相成的。當(dāng)我們不指定插入時,可以用到default約束。指定插入就可以選擇空約束。

三、列描述

所謂列描述,就是我們之前一直在使用的對列的注釋信息。用到的關(guān)鍵詞是comment,沒有實(shí)際含義,專門用來描述字段,會根據(jù)表創(chuàng)建語句保存,用來給程序員或DBA來進(jìn)行了解。

desc查看表結(jié)構(gòu)時并不能看到注釋信息,如下:

可以通過show來查看建表時的注釋信息,如下圖:

四、zerofill

在MySQL中,zerofill約束是一種用于數(shù)值字段的約束,它會在數(shù)值字段的值前面添加零,使其達(dá)到指定的長度。這通常用于保持?jǐn)?shù)值字段的位數(shù)一致性,尤其對于需要顯示位數(shù)對齊的情況非常有用。

當(dāng)你在MySQL中創(chuàng)建一個數(shù)值字段,并為其添加zerofill約束時,MySQL會自動在存儲數(shù)據(jù)時將數(shù)值填充為指定長度,并在需要的情況下,自動在數(shù)值前面添加零。

我們一直沒有解釋int(11)中的11的含義是什么,如下圖:

其實(shí)就是代表的整型的位數(shù),表示的是11位。

int的取值范圍是大約是21億正負(fù),最多也就是十位數(shù)字,負(fù)數(shù)的話再加上符號相當(dāng)于11位了。那么無符號整數(shù)是不是10位就可以了呢?是的。

如下圖所示:

我們也可以通過zerofill約束來驗(yàn)證一下。

我們現(xiàn)在將 id 的字段屬性修改一下,增加上zerofill約束。

如下圖:

我們再來插入一條數(shù)據(jù),觀察是否會自動補(bǔ)0:

如上圖所示,正是我們所說的那樣,不夠位數(shù)時會自動在前面補(bǔ)0。因?yàn)闀r無符號的整數(shù),所以一共是10位。

五、主鍵

在MySQL中,主鍵約束用于唯一標(biāo)識表中的每一行數(shù)據(jù)。怎么理解這句話呢?

通俗來講,一個事物可能會有很多的字段屬性,其中某一個屬性或者多個屬性組合能夠唯一標(biāo)示該事物,我們可以將該字段設(shè)置成主鍵類型。

舉個例子,一個合法的中國公民,都會有自己的身份證,每個人的身份證號是不同的,且身份證號能夠唯一的標(biāo)示某個人,那么身份證號就可以設(shè)置成主鍵類型。下面我們通過一個實(shí)際例子來看:

上圖的例子中,我們設(shè)置學(xué)生的學(xué)號為主鍵(primary key),用來唯一標(biāo)示一個學(xué)生的信息。

注意:主鍵對應(yīng)的字段的值不能重復(fù),不能為空,一張表中最多只能有一個主鍵,且主鍵所在的列通常是整數(shù)類型。

下面我們來插入一些數(shù)據(jù)來驗(yàn)證一下:

上圖驗(yàn)證的主鍵對應(yīng)的字段的值不能重復(fù)。一但重復(fù),就會報(bào)錯不讓你進(jìn)行操作。

再看如下圖,主鍵對應(yīng)的字段的值也不能為NULL

當(dāng)我們不想要這個主鍵時,直接將其刪除掉即可。

如下圖:

我們也不用指定刪除那個字段的主鍵,因?yàn)橐粡埍碇兄辉试S有一個主鍵。

當(dāng)表創(chuàng)建好以后但是沒有主鍵的時候,可以再次追加主鍵。

如下圖:

有時候一個字段并不能很好的標(biāo)示數(shù)據(jù)的唯一性,但是多個字段就可以。

我們也稱之為復(fù)合主鍵。復(fù)合主鍵就是在創(chuàng)建表的時候,在所有字段之后,使用多個字段作為主鍵。

具體實(shí)例如下:

如上圖,我們將 id 和 course 同時構(gòu)成主鍵,他們即為復(fù)合主鍵

我們在查看表結(jié)構(gòu)時,可以看到 id 和 course 的Key列都有PRI標(biāo)志,并不是說明有兩個主鍵,而是他們兩個組成了復(fù)合主鍵。并且它們都是不允許為空的。

我們來插入一些數(shù)據(jù)來觀察一下:

通過上圖也不難發(fā)現(xiàn),只有當(dāng)與復(fù)合主鍵中所有的字段的值相同時,才算沖突,并且不會讓你進(jìn)行插入。復(fù)合主鍵也是主鍵,所以對主鍵的操作也可以用到復(fù)合主鍵上。

六、自增長

在MySQL中,自增長約束是一種非常常見的約束,用于在插入數(shù)據(jù)時自動為表中的主鍵字段生成唯一的遞增值。

這種約束通常用于確保表中的每一行都具有唯一標(biāo)識,并且可以方便地避免手動指定主鍵值的繁瑣操作。

自增長約束通常與主鍵字段一起使用,通過自動分配唯一的、遞增的整數(shù)值來確保每行數(shù)據(jù)都有一個獨(dú)特的標(biāo)識符

下面我們來看一個實(shí)際的例子:

我們下面再來插入一些值來觀察一下:

我們再插入時并沒有設(shè)置id的值,但是在創(chuàng)建表的時候添加了自增長的約束。

所以我們看到默認(rèn)值是從1開始,然后加1增長

那要是我們自動為id添加了一個值,那么以后是怎么進(jìn)行增長的呢?

具體如下:

實(shí)際上數(shù)據(jù)庫一直在為我們維護(hù)者下一個的自增長的值是多少。所以我們用戶可以不再去擔(dān)心這個問題。

重點(diǎn)是自增長約束通常用于創(chuàng)建主鍵列,以確保數(shù)據(jù)的唯一性和完整性。

它適用于需要唯一標(biāo)識每個記錄的場景,例如用戶ID、訂單ID等。

七、唯一鍵

一張表中有往往有很多字段需要唯一性,數(shù)據(jù)不能重復(fù),但是一張表中只能有一個主鍵。唯一鍵就可以解決表中有多 個字段需要唯一性約束的問題。

MySQL中的唯一鍵約束是用于確保表中某一列(或多列的組合)的數(shù)值在整個列中是唯一的。

唯一鍵約束通過在表中創(chuàng)建唯一索引來實(shí)現(xiàn),其主要作用是防止用戶插入重復(fù)的數(shù)據(jù),確保數(shù)據(jù)的一致性和完整性。

我們知道每個人的電話號碼是不能重復(fù)的,所以將telephone字段設(shè)置了unique約束。

我們再來插入一些數(shù)據(jù)觀察一下:

通過上圖,我們也能發(fā)現(xiàn)某個字段具有唯一性約束時,該字段也可以為NULL。但是主鍵的值是不能為NULL的。其次,一但插入重復(fù)的值,就會報(bào)錯。同時,一張表中可以設(shè)置對個唯一鍵,但是一張表中只能有一個主鍵。

唯一鍵的本質(zhì)和主鍵差不多,唯一鍵允許為空,而且可以多個為空,空字段不做唯一性比較。關(guān)于唯一鍵和主鍵的區(qū)別: 我們可以簡單理解成,主鍵更多的是標(biāo)識唯一性的。而唯一鍵更多的是保證在業(yè)務(wù)上,不要和別的信息出現(xiàn)重復(fù)。

需要注意的是,不是主鍵具有唯一性,而是某個具有唯一性的字段被選擇成為了主鍵,而那些不是主鍵但是同樣需要唯一性約束的字段就應(yīng)該設(shè)置成唯一鍵。

八、外鍵

外鍵用于定義主表和從表之間的關(guān)系:外鍵約束主要定義在從表上,主表則必須是有主鍵約束或unique約束。當(dāng)定義外鍵后,要求外鍵列數(shù)據(jù)必須在主表的主鍵列存在或?yàn)閚ull。

一個學(xué)生一定隸屬于一個班級。一個班級會有很多學(xué)生。所以當(dāng)我們在定義學(xué)生表時,班級的信息一定會有大量的重復(fù)。

如下圖:

從上圖可知,會有很多學(xué)生都會記錄上相同的class_id 與 class_name。

這時候我們可以單獨(dú)創(chuàng)建一個班級表,讓班級表與學(xué)生表產(chǎn)生一定的聯(lián)系即可。

如下圖:

但是我們需要在student表中保留一個class的屬性,這樣才能與myclass表建立聯(lián)系。

具體如下圖:

在上圖中,我們把student表中的class_id設(shè)置成了外鍵。class_id在myclass表中是主鍵。那么這個時候主表就是myclass表,從表是student表。

主表會對從表產(chǎn)生一些約束的,也就是對帶有外鍵約束的列進(jìn)行約束。

主表中的數(shù)據(jù)如下圖:

下面我們來對從表插入一些數(shù)據(jù)看一下:

上圖中從表中的class_id是具有外鍵約束的。這時向student表中插入數(shù)據(jù)時,如果插入的數(shù)據(jù)對應(yīng)的class_id是myclass表中存在的,或者插入的class_id為null,那么此時是允許進(jìn)行插入的。

當(dāng)插入的class_id不是myclass表中存在的,那么就會插入失敗。通俗理解:當(dāng)試圖插入或更新數(shù)據(jù)時,MySQL會檢查引用的主鍵列是否存在有效值。如果沒有有效的主鍵值,則無法插入或更新數(shù)據(jù)。

所以在對外表進(jìn)行插入數(shù)據(jù)時,所具有外鍵約束的字段,插入的數(shù)據(jù)必須在主表中存在。否則就會插入失敗。我們還需要注意的是:外鍵列的值必須是唯一的,不能有重復(fù)值。

九、練習(xí)

有一個商店的數(shù)據(jù),記錄客戶及購物情況,有以下三個表組成:

商品goods(商品編號goods_id,商品名goods_name, 單價(jià)unitprice, 商品類別category, 供應(yīng)商provider);客戶customer(客戶號customer_id,姓名name,住址address,郵箱email,性別sex,身份證card_id);購買purchase(購買訂單號order_id,客戶號customer_id,商品號goods_id,購買數(shù)量nums)。

要求:

每個表的主外鍵;客戶的姓名不能為空值;郵箱不能重復(fù)。

  • goods表如下圖:

  • customer表如下圖:

  • purchase表如下圖:

總結(jié)

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Mysql Update批量更新的幾種方式

    Mysql Update批量更新的幾種方式

    今天小編就為大家分享一篇關(guān)于Mysql Update批量更新的幾種方式,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • mysql如何創(chuàng)建和刪除唯一索引(unique key)

    mysql如何創(chuàng)建和刪除唯一索引(unique key)

    這篇文章主要介紹了mysql如何創(chuàng)建和刪除唯一索引(unique key)問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 超出MySQL最大連接數(shù)問題及解決

    超出MySQL最大連接數(shù)問題及解決

    這篇文章主要介紹了超出MySQL最大連接數(shù)問題及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • 淺析MySQL 鎖和事務(wù)

    淺析MySQL 鎖和事務(wù)

    這篇文章主要介紹了MySQL 鎖和事務(wù)的相關(guān)資料,幫助大家更好的理解和使用MySQL數(shù)據(jù)庫,感興趣的朋友可以了解下
    2020-09-09
  • 解決MySQL8.0報(bào)錯Client does not support authentication protocol requested by server...問題

    解決MySQL8.0報(bào)錯Client does not support auth

    本文主要介紹了解決MySQL8.0報(bào)錯Client does not support authentication protocol requested by server...問題,文中通過代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-05-05
  • MYSQL使用.frm恢復(fù)數(shù)據(jù)表結(jié)構(gòu)的實(shí)現(xiàn)方法

    MYSQL使用.frm恢復(fù)數(shù)據(jù)表結(jié)構(gòu)的實(shí)現(xiàn)方法

    在這里我們探討使用.frm文件恢復(fù)數(shù)據(jù)表機(jī)構(gòu)(當(dāng)然如果你以前備份過數(shù)據(jù)表,你可以使用調(diào)用備份的數(shù)據(jù)表)
    2010-02-02
  • MySQL安裝詳解圖文版(V5.5 For Windows)

    MySQL安裝詳解圖文版(V5.5 For Windows)

    這幾年一直在用MySQL,并且是Windows+.Net+MySQL的搭配,用MyISAM引擎支持過單表每天千萬以上的數(shù)據(jù)遞增,TB級的數(shù)據(jù)MySQL游刃有余。
    2011-09-09
  • MySQL約束和表的復(fù)雜查詢操作大全

    MySQL約束和表的復(fù)雜查詢操作大全

    約束是關(guān)系型數(shù)據(jù)庫的一個重要功能,?添加到庫中的數(shù)據(jù)需要保證其的正確性;?約束,?就是讓數(shù)據(jù)庫幫助程序員更好的檢查數(shù)據(jù)是否正確.,這篇文章主要介紹了MySQL約束和表的復(fù)雜查詢操作,需要的朋友可以參考下
    2022-11-11
  • MySQL中的悲觀鎖與樂觀鎖

    MySQL中的悲觀鎖與樂觀鎖

    這篇文章主要介紹了MySQL中悲觀鎖與樂觀鎖的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)MySQL數(shù)據(jù)庫,感興趣的朋友可以了解下
    2020-09-09
  • win10下mysql 8.0.12 安裝及環(huán)境變量配置教程

    win10下mysql 8.0.12 安裝及環(huán)境變量配置教程

    這篇文章主要為大家詳細(xì)介紹了MySQL8.0的安裝、配置、啟動服務(wù)和登錄及配置環(huán)境變量,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-03-03

最新評論