" />

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

MySQL數(shù)據(jù)庫(kù)約束操作示例講解

 更新時(shí)間:2022年11月15日 17:07:54   作者:熬夜磕代碼丶  
約束是用來限制表中的數(shù)據(jù)長(zhǎng)什么樣子的,即什么樣的數(shù)據(jù)可以插入到表中,什么樣的數(shù)據(jù)插入不到表中,下面這篇文章主要給大家介紹了關(guān)于如何通過一文理解MySQL數(shù)據(jù)庫(kù)的約束與表的設(shè)計(jì)的相關(guān)資料,需要的朋友可以參考下

一、約束是什么

約束就是,在創(chuàng)建表的時(shí)候,對(duì)表設(shè)置一些規(guī)則,只有滿足這些規(guī)則,才可以插入數(shù)據(jù),我們把這些規(guī)則叫做約束

常見的約束有:

約束類型規(guī)則
Not Null指定某列不能存儲(chǔ)NULL值
UNIQUE保證某列的每行必須有唯一的值
DEFAULT給沒有賦值的列賦默認(rèn)值
PRIMARY KEYNot NULL 與 UNIQUE的結(jié)合,一個(gè)表的特定記錄
FOREIGN KEY保證一個(gè)表匹配另一個(gè)表的值,遵守參照完整性
CHECK保證列符合指定條件

數(shù)據(jù)庫(kù)約束是數(shù)據(jù)庫(kù)的一個(gè)重要功能,數(shù)據(jù)的 “完整性”(正確的數(shù)據(jù))可以通過人工的方式進(jìn)行確定,但人工還是有一點(diǎn)的缺陷,約束,就是讓數(shù)據(jù)庫(kù)幫助我們更好的檢查數(shù)據(jù)是否正確

二、約束的具體操作

Not NULL

 create table stu(
 id int,
 name varchar(50),
 sex char(3)
 );

當(dāng)我們建一個(gè)表時(shí),是允許為NULL的,如果我們不允許這一列為空時(shí),我們就需要加上Not NULL約束。

 create table stu(
 id int not null,
 name varchar(50),
 sex char(3)
 );

當(dāng)我們加上約束時(shí),可以發(fā)現(xiàn)id這一列不允許為空,我們?cè)囍迦胍粋€(gè)為NULL的id試一下。

當(dāng)我們插入的id為空時(shí),系統(tǒng)會(huì)報(bào)id 這一列不能為空的錯(cuò)誤。

當(dāng)我們插入一個(gè)非NULL的數(shù)據(jù)時(shí),可以成功插入。

UNIQUE

在我們某些業(yè)務(wù)需要中某些列的數(shù)據(jù)不能夠重復(fù),比如: 我們每個(gè)人的身份證號(hào),大學(xué)生的學(xué)號(hào),這些數(shù)據(jù)是唯一標(biāo)識(shí)性的不能夠重復(fù)。

 create table stu(
 id int unique,
 name varchar(50),
 sex char(3)
 );

這里的UNI == unique.

我們?cè)囍迦胍幌聰?shù)據(jù)看看。

我們可以發(fā)現(xiàn)再插入不同的id數(shù)據(jù)時(shí)是可以正常插入的,當(dāng)我們?cè)俅尾迦胍呀?jīng)出現(xiàn)過的id時(shí),系統(tǒng)會(huì)報(bào)一個(gè)重復(fù)條目的錯(cuò)誤。

一個(gè)小小的思考,數(shù)據(jù)庫(kù)是如何判斷你當(dāng)前這一條記錄是否為重復(fù)的?

當(dāng)然是先去查找,然后再去插入。

有的同學(xué)肯定會(huì)說,加上約束之后,數(shù)據(jù)庫(kù)的執(zhí)行速度不就大大的下降了,這里的查找是(借助索引進(jìn)行查找的,效率相對(duì)比較高,后面我們會(huì)介紹索引的相關(guān)知識(shí)),執(zhí)行效率確實(shí)受到了一定的影響,但比起手工去檢查,代價(jià)小的很多。

約束的組合使用

約束不僅可以單獨(dú)使用,而且可以多個(gè)組合起來對(duì)某一列進(jìn)行約束。

比如同時(shí)加上: Not NULL 和 unique(這里注意的是多個(gè)約束之間用空格間隔開,而不是逗號(hào)).

我們可以發(fā)現(xiàn)約束之間用逗號(hào)間隔會(huì)報(bào)錯(cuò)。

我們可以發(fā)現(xiàn)當(dāng)我們同時(shí)使用 Not NULL 和 unique約束時(shí),出現(xiàn)了一個(gè)PRI,PRI == primary key,這是什么我們往下看。

PRIMARY KEY

主鍵約束就是: not null + unique.

我們?cè)囍迦霂捉M數(shù)據(jù)。

我們可以發(fā)現(xiàn)主鍵列不能插入NULL類型的數(shù)據(jù)。

我們可以發(fā)現(xiàn)主鍵列插入不同的數(shù)據(jù)是OK的,如果插入相同的數(shù)據(jù),就會(huì)報(bào)錯(cuò)。

主鍵也同樣是在插入記錄的時(shí)候,先查詢,在插入:

正因?yàn)橹麈I和unique都有先查詢的過程,mysql就會(huì)默認(rèn)給這些列添加索引,提高查詢速度。

我們可以簡(jiǎn)單來驗(yàn)證一下,我們可以發(fā)現(xiàn)id列確實(shí)存在索引。

主鍵的注意事項(xiàng):

1.在開發(fā)過程中,大部分的表都會(huì)存在一個(gè)主鍵,逐漸往往是一個(gè)整數(shù)類型的id.

2.在mysql中,一個(gè)表里,只能存在一個(gè)主鍵,不能多個(gè)。

3.mysql允許將多個(gè)列共同作為一個(gè)主鍵(聯(lián)合主鍵)

4.mysql有自帶的"自增主鍵"(主鍵需要保證不重復(fù),如果我們手動(dòng)生成的話比較困難,這時(shí)我們就可以讓mysql自動(dòng)幫我們生成。

-- 設(shè)置自增主鍵
create table stu(id int primary key auto_increment);

當(dāng)我們將某一列設(shè)置為自增主鍵時(shí),如果需要系統(tǒng)自動(dòng)生成的話,我們插入null即可, 這里的null不是說把這個(gè)值設(shè)置為Null,而是交給數(shù)據(jù)庫(kù)使用自增主鍵。

每一個(gè)插入數(shù)據(jù)時(shí),mysql都會(huì)找到上一條記錄,自增。

我們也可以插入指定值。

我們可以發(fā)現(xiàn),當(dāng)我們指定值插入后,在使用自增主鍵,并不會(huì)去利用中間空余的間隙,而是參照最大值進(jìn)行自增。(這里其實(shí)是我們很常見的一個(gè)用空間換取時(shí)間的行為).

如果mysql的數(shù)據(jù)量非常大時(shí),自增主鍵還可以使用嗎?如果可以使用,又是如何分配呢?

當(dāng)我們數(shù)據(jù)量較小時(shí),所有的數(shù)據(jù)都在mysql服務(wù)器當(dāng)中存儲(chǔ)。

但是如果mysql的數(shù)據(jù)量很大時(shí),一臺(tái)主機(jī)可能放不下,就需要進(jìn)行分庫(kù)分表的操作。

當(dāng)數(shù)據(jù)過多時(shí),就需要分庫(kù)分表,實(shí)際上就是把一個(gè)大的表分為多個(gè)小的表,每個(gè)服務(wù)器存取一部分?jǐn)?shù)據(jù)。

這里我們就分為三個(gè)服務(wù)器進(jìn)行存儲(chǔ),每個(gè)服務(wù)器的表占各自的比例,三個(gè)服務(wù)器中的主鍵值是不能重復(fù)的。

三個(gè)服務(wù)器中的表的自增主鍵id是如何分配?

這里涉及到"分布式系統(tǒng)唯一id生成算法"

大概公式是: 時(shí)間戳 + 主機(jī)編號(hào) + 隨機(jī)因子 > 這三部分得到一個(gè)全局唯一的id

DEFAULT

在某些情況下,有些列的值大多數(shù)都是重復(fù)的,比如一個(gè)班的30個(gè)人,28個(gè)是男生,只有兩個(gè)女生,那么我們就可以把性別列默認(rèn)值設(shè)置為"男".

create table stu(id int primary key,name varchar(50),sex char(3) default '男');

我們可以看到性別這一列默認(rèn)為男。

我們可以發(fā)現(xiàn)當(dāng)我們沒有插入sex這一列,自動(dòng)為默認(rèn)值’男’.

FOREIGN KEY

外鍵約束是建立在兩張表之間的約束。

比如每個(gè)班的同學(xué)的班級(jí)號(hào)都是一樣的,我們就可以用班級(jí)號(hào)來建立班級(jí)表和學(xué)生表之間的約束.

create table class(classId int primary key,name varchar(50));

我們先創(chuàng)建一個(gè)班級(jí)表,插入一組數(shù)據(jù)。

create table stu(id int primary key,name varchar(50),classId int,foreign key(classId) references class(classId));

這個(gè)是外鍵約束的語法。

外鍵約束的含義時(shí),stu表中的classId必須在class表中是存在的。

當(dāng)我們插入class存在的classid為001的數(shù)據(jù)可以成功插入。

當(dāng)我們插入的classId在class中不存在時(shí),就會(huì)插入失敗。

此處起到約束的class表是"父表(parent)",被約束的表叫做"子表(child).

實(shí)則不然,我們子表對(duì)父表也產(chǎn)生了一定的約束。

我們可以發(fā)現(xiàn),無法刪除外鍵約束的父表。

這也很好理解,如果父表刪除了,子表的數(shù)據(jù)去哪里參考,如果想刪除,可以先刪除子表,在刪除父表。

我們可以發(fā)現(xiàn)當(dāng)父表相應(yīng)列不是主鍵時(shí),無法建立外鍵約束,這是為什么呢?

因?yàn)槊看卧俳o子表插入時(shí),都會(huì)先在父表先查詢這個(gè)id是否存在,如果表的數(shù)據(jù)十分大時(shí),效率十分地低,要使用索引。

要想創(chuàng)建外鍵,就要求父類相應(yīng)的列,有primary 或者 unique約束

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

相關(guān)文章

  • MySQL更新刪除操作update和delete使用詳解(小白慎用)

    MySQL更新刪除操作update和delete使用詳解(小白慎用)

    這篇文章主要為大家介紹了MySQL的更新刪除操作update和delete使用但是一定要慎用啊,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • mysql表的四種分區(qū)方式總結(jié)

    mysql表的四種分區(qū)方式總結(jié)

    通俗地講表分區(qū)是將一大表,根據(jù)條件分割成若干個(gè)小表,下面這篇文章主要給大家介紹了關(guān)于mysql表的四種分區(qū)方式,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-04-04
  • Windows下MySQL安裝教程圖文詳解

    Windows下MySQL安裝教程圖文詳解

    本文通過圖文并茂的形式給大家介紹了windows下mysql 安裝教程,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2018-10-10
  • MySQL系列之十三 MySQL的復(fù)制

    MySQL系列之十三 MySQL的復(fù)制

    這篇文章主要介紹了MySQL系列之十三 MySQL的復(fù)制,詳細(xì)的講述了多種復(fù)制架構(gòu)的案例和MySQL復(fù)制相關(guān)概念等,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • MySQL不能顯示中文問題及解決

    MySQL不能顯示中文問題及解決

    這篇文章主要介紹了MySQL不能顯示中文問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • MySQL的常用命令集錦

    MySQL的常用命令集錦

    這篇文章主要介紹了MySQL的常用命令集錦,堪稱初學(xué)者需要掌握的MySQL命令大全,其中系統(tǒng)命令行環(huán)境是基于類Unix系統(tǒng)來作例子的,需要的朋友可以參考下
    2015-11-11
  • mysql 計(jì)算函數(shù)詳情

    mysql 計(jì)算函數(shù)詳情

    這篇文章主要介紹了mysql 計(jì)算函數(shù),函數(shù)沒有SQL的可移植性強(qiáng) 能運(yùn)行在多個(gè)系統(tǒng)上的代碼稱為可移植的(portable)。相對(duì)來說,多數(shù)SQL語句是可移植的,在SQL實(shí)現(xiàn)之間有差異時(shí),這些差異通常不那么難處理,下面來看看文章的具體內(nèi)容吧
    2021-10-10
  • 在EF中使用MySQL的方法及常見問題

    在EF中使用MySQL的方法及常見問題

    這篇文章主要介紹了在EF中使用MySQL的方法及常見問題 的相關(guān)資料,需要的朋友可以參考下
    2016-06-06
  • 根據(jù)mysql慢日志監(jiān)控SQL語句執(zhí)行效率

    根據(jù)mysql慢日志監(jiān)控SQL語句執(zhí)行效率

    根據(jù)mysql慢日志監(jiān)控SQL語句執(zhí)行效率 啟用MySQL的log-slow-queries(慢查詢記錄)。
    2012-11-11
  • MySQL多實(shí)例安裝開機(jī)自啟動(dòng)服務(wù)配置過程

    MySQL多實(shí)例安裝開機(jī)自啟動(dòng)服務(wù)配置過程

    這篇文章主要介紹了MySQL中,多實(shí)例安裝開機(jī)自啟服務(wù)配置的過程詳細(xì)步驟,有需要的朋友可以借鑒參考下,希望可以有所幫助,感謝閱讀
    2021-09-09

最新評(píng)論

自贡市| 澄迈县| 探索| 五常市| 海南省| 天柱县| 泽库县| 通化市| 通城县| 成都市| 涞水县| 保定市| 台南市| 大同县| 祁门县| 资中县| 平乐县| 龙川县| 望谟县| 镇赉县| 齐齐哈尔市| 南城县| 景谷| 景谷| 江源县| 苏尼特右旗| 增城市| 静海县| 渑池县| 朔州市| 钟山县| 大厂| 深泽县| 枣阳市| 申扎县| 西乌珠穆沁旗| 汕头市| 克拉玛依市| 齐齐哈尔市| 射阳县| 万全县|