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

Mysql中設(shè)計(jì)數(shù)據(jù)表的過程解析

 更新時(shí)間:2025年07月28日 11:04:29   作者:代碼棧上的思考  
數(shù)據(jù)庫約束通過NOT NULL、UNIQUE、DEFAULT、主鍵和外鍵等規(guī)則保障數(shù)據(jù)完整性,自動(dòng)校驗(yàn)數(shù)據(jù),減少人工錯(cuò)誤,提升數(shù)據(jù)一致性和業(yè)務(wù)邏輯嚴(yán)謹(jǐn)性,本文介紹Mysql中設(shè)計(jì)數(shù)據(jù)表的過程,感興趣的朋友一起看看吧

1.引言

數(shù)據(jù)庫約束是確保數(shù)據(jù)完整性的關(guān)鍵機(jī)制,通過預(yù)定義的規(guī)則自動(dòng)校驗(yàn)數(shù)據(jù),避免人工檢查的繁瑣和潛在錯(cuò)誤。約束作用于表的列上,確保數(shù)據(jù)的正確性和關(guān)聯(lián)關(guān)系的有效性。以下是常見約束類型的詳細(xì)說明及示例。

2.NOT NULL——制定某列不可以存儲(chǔ)NULL值

用于禁止某列存儲(chǔ)空值(NULL),強(qiáng)制字段為必填項(xiàng)。

先來看看不加約束的學(xué)生表格所展示出來的信息:

desc student;

當(dāng)沒有指定非空約束的時(shí)候,當(dāng)前的列表示是可以寫入一個(gè)NULL的值的,如果要把某一列定義為一個(gè)必填項(xiàng),那么就可以使用not null來進(jìn)行約束。示例如下:

CREATE TABLE student(
    id BIGINT not NULL,
    name VARCHAR(50)
);

 如圖所示這個(gè)NO就表示當(dāng)前列(id列)不能為空 

下面我們插入一條為空的id數(shù)據(jù)試試:

INSERT into student VALUES(NULL,'張三');

 寫入這條數(shù)據(jù)的時(shí)候會(huì)報(bào)錯(cuò),提示不可寫入null的數(shù)值,這里數(shù)據(jù)庫就幫我們進(jìn)行了一次校驗(yàn)。

INSERT INTO student VALUES(1,'張三');

當(dāng)我們寫入一條id列不為空的數(shù)據(jù)的時(shí)候,就可以正常寫入這條數(shù)據(jù)

2.UNIQUE——保證某一列的每一行必須有唯一的數(shù)值

確保某列的數(shù)值在表中唯一,適用于如學(xué)號(hào)、身份證號(hào)等場(chǎng)景。
我們首先來看一下不加唯一約束的時(shí)候的情況:

可見這出現(xiàn)了編號(hào)相同但是人名不一致的情況,這種情況不符合邏輯。如何解決這一問題呢?
UNIQUE這一約束條件就應(yīng)運(yùn)而生了
下面我們來看一下如何創(chuàng)建一個(gè)在id字段加唯一約束的表:

CREATE TABLE student(
    id BIGINT UNIQUE,
    name VARCHAR(50)
);

 由上圖可見id的Key有一個(gè)UNI的標(biāo)識(shí),這就表示唯一約束
這時(shí)如果我們?cè)俨迦雰蓚€(gè)一樣的id數(shù)據(jù)就會(huì)報(bào)錯(cuò),錯(cuò)誤信息如下:

 需要注意的是NULL可以重復(fù)插入,并不會(huì)報(bào)錯(cuò)

3. DEFAULT——規(guī)定沒有給列賦值時(shí)的默認(rèn)值

用于為列指定默認(rèn)值,當(dāng)插入數(shù)據(jù)未顯式賦值時(shí)自動(dòng)填充。

INSERT INTO student (id) VALUES(2);

如果我們不指定name的默認(rèn)值就會(huì)出現(xiàn)這樣的情況,顯然這種情況也是不合理的
下面我們就來創(chuàng)建一個(gè)給name列設(shè)置默認(rèn)值的一個(gè)數(shù)據(jù)表

CREATE TABLE student(
  id BIGINT UNIQUE,
  NAME VARCHAR(50) DEFAULT '無名氏'
);

這個(gè)Default無名氏就是我們指定的默認(rèn)值
Null列表示當(dāng)前列是否可以為空
Key表示數(shù)據(jù)行的鍵值(標(biāo)識(shí))
Extra標(biāo)識(shí)擴(kuò)展信息 

下面我們來演示一下只指定了id會(huì)出現(xiàn)什么情況:

INSERT INTO student (id) VALUES(2);

由此可見這時(shí)的name就用默認(rèn)值進(jìn)行填充了
下面我們來思考這樣一個(gè)問題:如果我們給name列設(shè)置為NULL會(huì)出現(xiàn)什么情況呢?

INSERT INTO student VALUES(3,NULL);

 由此可見,雖然我們已經(jīng)指定了默認(rèn)約束,但是當(dāng)我們手動(dòng)指定這一列的值為NULL的時(shí)候,插入的值依舊是NULL,因?yàn)檫@個(gè)NULLL是我們自己手動(dòng)指定的,也可以理解為:用戶指定的優(yōu)先級(jí)要高于默認(rèn)約束。
于是我們可以得到這樣一個(gè)結(jié)論:
當(dāng)我們?yōu)槟骋涣性O(shè)置了默認(rèn)約束的時(shí)候,如果不給這個(gè)列指定值才會(huì)使用默認(rèn)約束。

4.PRIMARY KEY ——NOT NULL和UNIQUE的結(jié)合

確保某列(或者兩個(gè)列多個(gè)列的結(jié)合)有唯一標(biāo)識(shí),有助于更容易快速找到表中的一個(gè)特定記錄。

主鍵是 NOT NULL 和 UNIQUE的結(jié)合,用于唯一標(biāo)識(shí)記錄。

下面我們首先來演示一下如何把某一列的值約束為非空且唯一的:

CREATE TABLE student(
-- 下面這個(gè)就把id設(shè)置為了 不為空 并且唯一 注意: not null 和unique之間不能有, 直接空格就行
  id BIGINT not NULL UNIQUE,
  sn int UNIQUE,
  name VARCHAR(50) DEFAULT '無名氏'
);

由上圖可見這個(gè)id的Key列中被標(biāo)識(shí)為了一個(gè)PRI,表示他是一個(gè)主鍵
我們?cè)趯懭霐?shù)據(jù)的時(shí)候這兩個(gè)約束是同時(shí)生效的:

CREATE TABLE student(
    id BIGINT PRIMARY KEY  AUTO_INCREMENT,
    sn int UNIQUE,
    name VARCHAR(20) DEFAULT '無名氏'
);

這個(gè)id列的Extro的AUTO_INCREMENT表示自增類型,意為在當(dāng)前表中上一條記錄的基本上+1即可
這樣設(shè)計(jì)的好處在于:讓數(shù)據(jù)庫去幫助我們維護(hù)主鍵的增長(zhǎng),不用自己去計(jì)算了,在插入數(shù)值的時(shí)候先找到最大的值,然后在這個(gè)基礎(chǔ)上+1生成一個(gè)新的值,從而作為一個(gè)數(shù)據(jù)行主鍵(也就是id列)的值。

4.1全列插入演示

在寫入數(shù)據(jù)的時(shí)候,我們不具體指定主鍵列的值,而是用NULL代替

INSERT INTO student VALUES(null,1001,'張三');
INSERT INTO student VALUES(null,1002,'李四');
SELECT* FROM student;

由此可見:

當(dāng)設(shè)置了自增主鍵之后,寫入null的時(shí)候,也可以成功插入數(shù)據(jù)。這里并不是說把這個(gè)null寫入數(shù)據(jù)庫了,而是說數(shù)據(jù)庫幫我們?nèi)ヌ幚磉@個(gè)列中的數(shù)值(進(jìn)行自增操作

4.2指定列插入演示

INSERT INTO student(sn,name) VALUES(1003,'王五'),(1004,'趙六');
SELECT* FROM student;

由此可見當(dāng)我們進(jìn)行指定列插入的時(shí)候,也會(huì)自動(dòng)生成id,作為該數(shù)據(jù)行的主鍵 。

下面我們思考這樣一個(gè)問題:我們可不可以指定一個(gè)主鍵值呢?
時(shí)間是檢驗(yàn)真理的唯一標(biāo)準(zhǔn),接下來我們就手動(dòng)指定來看看吧~

INSERT INTO student VALUES(100,1010,'錢七');
SELECT* FROM student;

由此可見這個(gè)操作是可以的,只要主鍵值不重復(fù)即可 

我們?cè)谶@個(gè)基礎(chǔ)之上再插入一條不指定id的數(shù)據(jù)試試,在這之前我們可以思考一下 這條新數(shù)據(jù)的id數(shù)值是多少呢?

INSERT INTO student(sn,name) VALUES(1011,'王二');

由此可見這個(gè)id的值是在原先數(shù)據(jù)表中id的最大值的基礎(chǔ)上加1,由此可見主鍵在數(shù)據(jù)表中有可能不是連續(xù)的

4.3一個(gè)表中不允許有兩個(gè)主鍵

CREATE TABLE test111(
  id BIGINT PRIMARY KEY,
  sn BIGINT PRIMARY KEY
);

由上可見一個(gè)表中不可以同時(shí)設(shè)置兩個(gè)主鍵,這樣會(huì)報(bào)錯(cuò)。
但是一個(gè)主鍵可以同時(shí)包含多個(gè)列(復(fù)合主鍵)
下面我們就來演示一下復(fù)合主鍵:

CREATE TABLE stu1(
  id BIGINT,
  NAME VARCHAR(20),
  mail VARCHAR(50),
  PRIMARY KEY (id,name)
);
DESC stu1;

由上圖可知 id 和name的Key都有PRI 這就表示當(dāng)前的表定義了復(fù)合主鍵,
復(fù)合主鍵在進(jìn)行唯一校驗(yàn)的時(shí)候,只有復(fù)合主鍵中所有的列都相同才被判定為相同
下面我們通過例子來證實(shí)這一說法:

INSERT INTO stu1 VALUES(1,'張三','zs.com');
SELECT* FROM stu1;

下面我們?cè)賹懭胍粭l和這個(gè)一樣的數(shù)據(jù),看看會(huì)發(fā)生什么現(xiàn)象: 

INSERT INTO stu1 values(1,'張三','zs.com');

報(bào)錯(cuò)了,那就證明這條數(shù)據(jù)是不可以寫入的,因?yàn)樗颓懊嬉粭l數(shù)據(jù)完全一致。

下面我們嘗試一下id一樣,name不一樣是否可以成功寫入呢?

INSERT INTO stu1 VALUES(1,'李四','ls.com');
SELECT* FROM stu1;

由此可見這條數(shù)據(jù)雖然id和前面張三的id一樣,但是姓名不同,因此這條數(shù)據(jù)是可以插入成功的 

5.FOREIGN KEY——保證一個(gè)表中的數(shù)據(jù)匹配另一個(gè)表中的值的參照完整性

用于維護(hù)表間的參照完整性,確保子表字段匹配主表的主鍵或唯一鍵。

我們先創(chuàng)建一個(gè)學(xué)生表和一個(gè)班級(jí)表,展示如下:

學(xué)生表的class_id一列的編號(hào)和班級(jí)表的id編號(hào)是具備對(duì)應(yīng)關(guān)系的,但是此時(shí)我們并沒有進(jìn)行設(shè)置外鍵約束,這時(shí)我們?cè)趯W(xué)生表中插入一條數(shù)據(jù),并且這個(gè)數(shù)據(jù)的class_id是不在班級(jí)表中存在的。

INSERT into student(name,class_id) VALUES('錢七',5);

由此可見這個(gè)操作是可以執(zhí)行成功的,顯然這個(gè)做法是不合理的,那么接下來我們引入:外鍵用于關(guān)聯(lián)其他表的主鍵或唯一鍵
語法:foreign key(字段名) references 主表(列)

CREATE TABLE student(
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(20) not NULL,
  class_id BIGINT,
  foreign KEY(class_id) REFERENCES class(id)
);

foreign KEY表示創(chuàng)建外鍵的關(guān)鍵字 
class_id表示當(dāng)前表中哪一個(gè)字段與主表建立主外鍵關(guān)系
REFERENCES:關(guān)鍵字,表示后面要引入哪個(gè)表的那個(gè)列
class(id):指定主表和相應(yīng)的列 

 這個(gè)MUL就表示存在外鍵關(guān)系 
這時(shí)我們插入正確的班級(jí)編號(hào)是可以的:

此時(shí)再插入不存在的班級(jí)編號(hào):

這樣就不行了

5.1問題:當(dāng)子表中存在對(duì)主表的依賴的時(shí)候,能不能刪除主表中相應(yīng)的記錄?

我們以刪除班級(jí)編號(hào)為4為例:

這會(huì)報(bào)一個(gè)主外鍵的錯(cuò)誤。
下面我們先刪除子表中依賴班級(jí)4的數(shù)據(jù),再刪除主表中班級(jí)為4的數(shù)據(jù):

DELETE FROM student WHERE class_id=4;
DELETE FROM class WHERE id=4;
SELECT*from class;

由此我們可以得出以下結(jié)論:
如果要?jiǎng)h除主表中的記錄,那么子表中的數(shù)據(jù)不能對(duì)該條記錄有依賴
也就意味著先要?jiǎng)h除子表中的記錄,再去刪除主表中的記錄 

6.CHECK-保證列中的值符合指定的條件

用于限制列值的范圍,僅允許符合條件的數(shù)據(jù)。

CREATE TABLE test_check(
  id BIGINT,
  gender VARCHAR(1),
  CHECK(gender='男' or gender='女')
);

check為關(guān)鍵字
后面的gender表示要檢查的列名=后面表示該列允許的值
下面我們執(zhí)行這條語句:

INSERT into test_check VALUES(1,'無');

 這樣就報(bào)錯(cuò)了 因?yàn)?lsquo;無’并不在允許的值的范圍之內(nèi)。

總結(jié)

數(shù)據(jù)庫約束通過自動(dòng)化校驗(yàn)機(jī)制保障數(shù)據(jù)質(zhì)量,減少人工干預(yù)的風(fēng)險(xiǎn)。合理使用 NOT NULLUNIQUEPRIMARY KEY、FOREIGN KEY 和 CHECK 約束,能有效提升數(shù)據(jù)一致性和業(yè)務(wù)邏輯的嚴(yán)謹(jǐn)性。

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

  • MySQL的幾種分頁方式,你知道幾種方式

    MySQL的幾種分頁方式,你知道幾種方式

    這篇文章主要介紹了MySQL的幾種分頁方式,需要的朋友可以參考下
    2023-06-06
  • mysql數(shù)據(jù)庫語句優(yōu)化過程

    mysql數(shù)據(jù)庫語句優(yōu)化過程

    這篇文章主要介紹了mysql數(shù)據(jù)庫語句優(yōu)化過程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-07-07
  • 簡(jiǎn)單了解MySQL SELECT執(zhí)行順序

    簡(jiǎn)單了解MySQL SELECT執(zhí)行順序

    MySQL數(shù)據(jù)據(jù)庫中我們經(jīng)常使用SQL SELECT語句來查詢數(shù)據(jù),那么關(guān)于它的執(zhí)行順序,下面小編來帶大家簡(jiǎn)單了解一下
    2019-05-05
  • mysql數(shù)據(jù)備份與恢復(fù)實(shí)現(xiàn)方法分析

    mysql數(shù)據(jù)備份與恢復(fù)實(shí)現(xiàn)方法分析

    這篇文章主要介紹了mysql數(shù)據(jù)備份與恢復(fù)實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了mysql數(shù)據(jù)備份與恢復(fù)常見實(shí)現(xiàn)方法與相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2020-04-04
  • MySQL編碼不一致可能引起的一些問題

    MySQL編碼不一致可能引起的一些問題

    這篇文章主要給大家介紹了關(guān)于MySQL編碼不一致可能引起的一些問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • mysql 5.6.21 安裝與配置詳細(xì)步驟

    mysql 5.6.21 安裝與配置詳細(xì)步驟

    這篇文章主要介紹了mysql5.6.21安裝與配置的詳細(xì)步驟,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • MySQL 5.7忘記root密碼后修改的詳細(xì)教程

    MySQL 5.7忘記root密碼后修改的詳細(xì)教程

    因?yàn)殚L(zhǎng)時(shí)間不操作mysql而忘記root密碼的朋友估計(jì)不在少數(shù),最近發(fā)現(xiàn)在MySQL 5.7版本下用之前的方法修改密碼不能成功了,所以只能重新想辦法解決,下面這篇文章主要給大家介紹了MySQL 5.7忘記root密碼后修改的詳細(xì)教程,需要的朋友可以參考。
    2017-05-05
  • MySQL全文索引觸發(fā)OOM案例分析

    MySQL全文索引觸發(fā)OOM案例分析

    這篇文章主要介紹了MySQL全文索引觸發(fā)OOM案例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • 最新評(píng)論

    云阳县| 长泰县| 平定县| 长岛县| 广水市| 荔浦县| 阿克陶县| 青田县| 楚雄市| 通化县| 崇信县| 永和县| 大丰市| 南汇区| 洪洞县| 阜平县| 敖汉旗| 洞口县| 襄樊市| 大荔县| 嵩明县| 本溪| 治县。| 大同市| 龙泉市| 翁牛特旗| 和龙市| 安乡县| 关岭| 临高县| 扶余县| 桐乡市| 五华县| 德格县| 体育| 汨罗市| 名山县| 河南省| 彭泽县| 绥滨县| 巴青县|