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

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

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

1.引言

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

2.NOT NULL——制定某列不可以存儲NULL值

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

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

desc student;

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

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

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

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

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

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

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

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

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

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

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

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

 由上圖可見id的Key有一個UNI的標(biāo)識,這就表示唯一約束
這時如果我們再插入兩個一樣的id數(shù)據(jù)就會報錯,錯誤信息如下:

 需要注意的是NULL可以重復(fù)插入,并不會報錯

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

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

INSERT INTO student (id) VALUES(2);

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

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

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

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

INSERT INTO student (id) VALUES(2);

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

INSERT INTO student VALUES(3,NULL);

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

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

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

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

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

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

由上圖可見這個id的Key列中被標(biāo)識為了一個PRI,表示他是一個主鍵
我們在寫入數(shù)據(jù)的時候這兩個約束是同時生效的:

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

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

4.1全列插入演示

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

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

由此可見:

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

4.2指定列插入演示

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

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

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

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

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

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

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

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

4.3一個表中不允許有兩個主鍵

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

由上可見一個表中不可以同時設(shè)置兩個主鍵,這樣會報錯。
但是一個主鍵可以同時包含多個列(復(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)的時候,只有復(fù)合主鍵中所有的列都相同才被判定為相同
下面我們通過例子來證實(shí)這一說法:

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

下面我們再寫入一條和這個一樣的數(shù)據(jù),看看會發(fā)生什么現(xiàn)象: 

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

報錯了,那就證明這條數(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——保證一個表中的數(shù)據(jù)匹配另一個表中的值的參照完整性

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

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

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

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

由此可見這個操作是可以執(zhí)行成功的,顯然這個做法是不合理的,那么接下來我們引入:外鍵用于關(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)前表中哪一個字段與主表建立主外鍵關(guān)系
REFERENCES:關(guān)鍵字,表示后面要引入哪個表的那個列
class(id):指定主表和相應(yīng)的列 

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

此時再插入不存在的班級編號:

這樣就不行了

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

我們以刪除班級編號為4為例:

這會報一個主外鍵的錯誤。
下面我們先刪除子表中依賴班級4的數(shù)據(jù),再刪除主表中班級為4的數(shù)據(jù):

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

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

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,'無');

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

總結(jié)

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

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

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

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

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

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

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

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

    MySQL數(shù)據(jù)據(jù)庫中我們經(jīng)常使用SQL SELECT語句來查詢數(shù)據(jù),那么關(guān)于它的執(zhí)行順序,下面小編來帶大家簡單了解一下
    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ì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • mysql 5.6.21 安裝與配置詳細(xì)步驟

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

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

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

    因?yàn)殚L時間不操作mysql而忘記root密碼的朋友估計不在少數(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
  • 最新評論

    蕉岭县| 西平县| 崇义县| 华安县| 融水| 金川县| 庄河市| 咸丰县| 蓬溪县| 渝中区| 和林格尔县| 聂拉木县| 肇东市| 汶川县| 长沙县| 明溪县| 荔波县| 建昌县| 普洱| 陇川县| 京山县| 丰县| 庐江县| 呼图壁县| 大洼县| 宁蒗| 泸州市| 宜黄县| 通化市| 延长县| 双流县| 肃宁县| 六盘水市| 义乌市| 澜沧| 安宁市| 泰州市| 资讯 | 苏尼特右旗| 郁南县| 临泉县|