最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL?數(shù)據(jù)庫的約束及數(shù)據(jù)表的設(shè)計(jì)原理

 更新時(shí)間:2022年01月24日 16:23:49   作者:吞吞吐吐大魔王  
這篇文章主要介紹了MySQL?數(shù)據(jù)庫的約束及數(shù)據(jù)表的設(shè)計(jì)原理,數(shù)據(jù)庫中的約束即是對(duì)插入數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行限定,為了保證數(shù)據(jù)的有效性和完整性,下面一起來了解具體的詳細(xì)內(nèi)容,需要的小伙伴可以參考一下

1. 數(shù)據(jù)庫的約束

1.1 介紹

數(shù)據(jù)庫中的約束 ,顧名思義即是對(duì)插入數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行限定,這么做的目的是為了保證數(shù)據(jù)的有效性和完整性。 這樣就大幅度地提高了數(shù)據(jù)庫中數(shù)據(jù)的質(zhì)量,節(jié)省了數(shù)據(jù)庫的空間和調(diào)用數(shù)據(jù)的時(shí)間。

之前介紹過 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 約束類型

常見約束的類型有以下幾種:

  • not null: 指示某列不能存儲(chǔ) null 值
  • unique: 保證某列的每行必須是唯一值,不能有重復(fù)
  • default: 規(guī)定沒有給列賦值時(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ù)庫,可以使用 check,但是其使用結(jié)果忽略

1.3 not null

如果不使用 not null,即表示默認(rèn)情況下可以插入 null(即這列的值可以不填)

但是例如做一些調(diào)查問卷時(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ì)影響效率,但總的來說利大于弊。

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è)數(shù)據(jù)庫中可以有商品表和訂單表兩個(gè)數(shù)據(jù)表,而這兩個(gè)表都可以包含商品編號(hào)。而訂單表里面的商品編號(hào)一定是商品表里面有的前提下才可以出現(xiàn)。因此就可以使用外鍵來約束,防止非正常數(shù)據(jù)出現(xiàn)

示例:

作用:

外鍵約束將兩張表綁定起來,其中被約束的表可以叫做子表,約束別人的表叫做父表,如果子表中的列要插入的值在父表中關(guān)聯(lián)的主鍵或唯一值中沒有,那么將插入將會(huì)失敗

注意: 外鍵約束會(huì)導(dǎo)致父表中的記錄不能直接刪,那么想要?jiǎng)h除父表的記錄該怎么做呢?(例如要下架某個(gè)商品,該商品的編號(hào)也就沒了)

解決思路: 邏輯刪除(不直接刪除數(shù)據(jù)庫的記錄,沒有打破外鍵約束)

在商品表中引入一個(gè)新的字段,通過這個(gè)字段表示該記錄是有效還是無效的??梢粤钸@個(gè)字段默認(rèn)值為1,即表示有效,如果要?jiǎng)h除這個(gè)商品,就把這個(gè)字段改為0,此時(shí)該商品就無效了。

1.8 check

check 約束是可以指定某列可以填入的數(shù)據(jù),例如性別,就只能填入男或者女

注意:

MySQL 中現(xiàn)在還不支持該約束,即使用了,也會(huì)忽略該約束的影響

示例:

2. 數(shù)據(jù)庫表的設(shè)計(jì)

當(dāng)我們掌握了基本的數(shù)據(jù)庫的操作方法后,如果我們要面對(duì)一個(gè)從零開始建表的操作,勢(shì)必要對(duì)我們需要的實(shí)體和它們之間的關(guān)系有一個(gè)很好的把握。

實(shí)體之間的關(guān)系主要存在以下四種:

  • 無關(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)來將學(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í)來進(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é)生來選擇。

這時(shí)我們?cè)O(shè)計(jì)三個(gè)表,分別為存放學(xué)生信息的 A 表、存放課程信息的 B 表和將學(xué)生與課程聯(lián)系起來的中間表 C 表

A表:

學(xué)號(hào)學(xué)生姓名
2001張三
2002李四
2003王五

B 表:

課程id課程名
1高等數(shù)學(xué)
2大學(xué)物理
3數(shù)據(jù)庫理論

C 表:

學(xué)號(hào)課程id
20011
20012
20021
20023
20031

到此這篇關(guān)于MySQL 數(shù)據(jù)庫的約束及數(shù)據(jù)表的設(shè)計(jì)原理的文章就介紹到這了,更多相關(guān)MySQL 數(shù)據(jù)庫的約束及數(shù)據(jù)表設(shè)計(jì)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Linux下MySQL多實(shí)例部署及安裝指南

    Linux下MySQL多實(shí)例部署及安裝指南

    Mysql多實(shí)例就是在一臺(tái)服務(wù)器上同時(shí)開啟多個(gè)不同的服務(wù)端口(3306、3307),同時(shí)運(yùn)行多個(gè)Mysql服務(wù)進(jìn)程,這些服務(wù)進(jìn)程通過不同的socket監(jiān)聽不同的服務(wù)端口來提供服務(wù),這篇文章主要介紹了Linux下MySQL多實(shí)例部署記錄,需要的朋友可以參考下
    2021-08-08
  • 基于mysql 默認(rèn)排序規(guī)則的坑

    基于mysql 默認(rèn)排序規(guī)則的坑

    這篇文章主要介紹了解決mysql 默認(rèn)排序規(guī)則的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看不看
    2021-02-02
  • 深入淺析MySQL?Explain

    深入淺析MySQL?Explain

    這篇文章主要介紹了MySQL?Explain詳解,expain出來的信息有10列,分別是id、select_type、table、type、possible_keys、key、key_len、ref、rows、Extra,本文對(duì)每一字段進(jìn)行逐一解釋,需要的朋友可以參考下
    2022-07-07
  • Mysql臨時(shí)表原理及創(chuàng)建方法解析

    Mysql臨時(shí)表原理及創(chuàng)建方法解析

    這篇文章主要介紹了Mysql臨時(shí)表原理及創(chuàng)建方法解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • 關(guān)于MySQL 大批量插入時(shí)如何過濾掉重復(fù)數(shù)據(jù)

    關(guān)于MySQL 大批量插入時(shí)如何過濾掉重復(fù)數(shù)據(jù)

    這篇文章主要介紹關(guān)于MySQL 大批量插入時(shí)如何過濾重復(fù)數(shù)據(jù),比如線上庫有6個(gè)表存在重復(fù)數(shù)據(jù),其中2個(gè)表比較大,96萬+和30萬+,因?yàn)橹疤幚磉^相同的問題,就直接拿來了上次的Python去重腳本,腳本很簡單,就是連接數(shù)據(jù)庫,查出來重復(fù)數(shù)據(jù),循環(huán)刪除,需要的朋友可以參考下
    2021-09-09
  • MySQL每日一練項(xiàng)目之校園教務(wù)系統(tǒng)

    MySQL每日一練項(xiàng)目之校園教務(wù)系統(tǒng)

    這篇文章主要給大家介紹了關(guān)于MySQL每日一練項(xiàng)目之校園教務(wù)系統(tǒng)的相關(guān)資料,教務(wù)管理系統(tǒng)是一套高校專用管理系統(tǒng),主要用于解決信息化辦公流程、學(xué)生管理、課程管理、教職工管理等相關(guān)問題,需要的朋友可以參考下
    2023-09-09
  • mysql數(shù)據(jù)庫查詢基礎(chǔ)命令詳解

    mysql數(shù)據(jù)庫查詢基礎(chǔ)命令詳解

    這篇文章主要介紹了mysql數(shù)據(jù)庫查詢基礎(chǔ)命令,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-11-11
  • MySQL數(shù)據(jù)庫開發(fā)的36條原則(小結(jié))

    MySQL數(shù)據(jù)庫開發(fā)的36條原則(小結(jié))

    這篇文章主要介紹了MySQL數(shù)據(jù)庫開發(fā)的36條原則(小結(jié)),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • 數(shù)據(jù)庫中GROUP?BY語句詳解、示例、注意事項(xiàng)

    數(shù)據(jù)庫中GROUP?BY語句詳解、示例、注意事項(xiàng)

    在Oracle數(shù)據(jù)庫中GROUP?BY是用于對(duì)結(jié)果集進(jìn)行分組的一個(gè)關(guān)鍵字,這篇文章主要給大家介紹了關(guān)于數(shù)據(jù)庫中GROUP?BY語句詳解、示例、注意事項(xiàng)的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-06-06
  • MySQL鎖等待超時(shí)問題的原因和解決方案(Lock wait timeout exceeded; try restarting transaction)

    MySQL鎖等待超時(shí)問題的原因和解決方案(Lock wait timeout exceed

    在數(shù)據(jù)庫開發(fā)和管理中,鎖等待超時(shí)是一個(gè)常見而棘手的問題,對(duì)于使用 MySQL 的應(yīng)用程序,尤其是采用 InnoDB 存儲(chǔ)引擎的場(chǎng)景,這一問題更是屢見不鮮,本文給大家介紹了MySQL鎖等待超時(shí)問題的原因和解決方案,需要的朋友可以參考下
    2024-11-11

最新評(píng)論

盖州市| 乌恰县| 靖边县| 仁化县| 西丰县| 临湘市| 龙州县| 无锡市| 漠河县| 温州市| 武邑县| 石狮市| 沁源县| 肥东县| 仪陇县| 明星| 灌阳县| 高安市| 高陵县| 视频| 阿荣旗| 始兴县| 纳雍县| 南投县| 长葛市| 潜山县| 揭西县| 贡觉县| 英超| 普兰县| 长岛县| 岑溪市| 靖西县| 建始县| 屯昌县| 鄂尔多斯市| 蓬溪县| 郑州市| 永丰县| 桦甸市| 故城县|