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

MySQL數(shù)據(jù)庫(kù)的約束使用實(shí)例

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

數(shù)據(jù)庫(kù)的約束就是關(guān)系型數(shù)據(jù)庫(kù)給我們提供的一種"校驗(yàn)數(shù)據(jù)"合法性的機(jī)制

1. NULL約束

創(chuàng)建表時(shí),可以指定某列不為空

create table student(
    id int not null,
    sn int,
    name varchar(20),
    qq_mail varchar(20)
);
mysql> desc student;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id      | int(11)     | NO   |     | NULL    |       |
| sn      | int(11)     | YES  |     | NULL    |       |
| name    | varchar(20) | YES  |     | NULL    |       |
| qq_mail | varchar(20) | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

2. UNIQUE(唯一約束)

保證某列的每行必須有唯一的值

重新設(shè)置一下表的結(jié)構(gòu)

create table student1(
    id int not null,
    sn int unique,
    name varchar(20),
    qq_mail varchar(20)
);
mysql> desc student1;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id      | int(11)     | NO   |     | NULL    |       |
| sn      | int(11)     | YES  | UNI | NULL    |       |
| name    | varchar(20) | YES  |     | NULL    |       |
| qq_mail | varchar(20) | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+

表示sn這列的值時(shí)唯一的不重復(fù)的

3. DEFAULT(默認(rèn)值約束)

規(guī)定沒(méi)有給列賦值時(shí)的默認(rèn)值

指定插入數(shù)據(jù)時(shí),name列為空,默認(rèn)值unkown

create table student2(
    id int not null,
    sn int unique,
    name varchar(20) default 'unkown',
    qq_mail varchar(20)
);
mysql> desc student2;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id      | int(11)     | NO   |     | NULL    |       |
| sn      | int(11)     | YES  | UNI | NULL    |       |
| name    | varchar(20) | YES  |     | unkown  |       |
| qq_mail | varchar(20) | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

插入一個(gè)id但不插入name時(shí):

insert into student2 (id) values (1);
mysql> select*from student2;
+----+------+--------+---------+
| id | sn   | name   | qq_mail |
+----+------+--------+---------+
|  1 | NULL | unkown | NULL    |
+----+------+--------+---------+
1 row in set (0.00 sec)

name是默認(rèn)值

4. PRIMARY KEY(主鍵約束)

NOT NULL 和 UNIQUE 的結(jié)合

確保某列有唯一標(biāo)識(shí),有助于快速找到表中的一個(gè)特定記錄

create table student3(
    id int not null primary key,
    sn int unique,
    name varchar(20) default 'unkown',
    qq_mail varchar(20)
);
mysql> desc student3;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id      | int(11)     | NO   | PRI | NULL    |       |
| sn      | int(11)     | YES  | UNI | NULL    |       |
| name    | varchar(20) | YES  |     | unkown  |       |
| qq_mail | varchar(20) | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

主鍵是not null 和 unique 的結(jié)合,也可以不用 not null

id int primary key

對(duì)于整數(shù)類型的主鍵,例如id,常搭配自增長(zhǎng)auto_increment來(lái)使用

當(dāng)插入數(shù)據(jù)對(duì)應(yīng)字段不給定值時(shí),使用最大值加一

mysql> create table student4(
    id int primary key auto_increment,
    sn int unique,
    name varchar(20) default 'unkown',
    qq_mail varchar(20)
);

接下來(lái)我們插入記錄時(shí),id為null

mysql> insert into student4 values (null,1000,'zhangsan',null);
Query OK, 1 row affected (0.00 sec)
mysql> insert into student4 values (null,1001,'zhangsi',null);
Query OK, 1 row affected (0.00 sec)
//將id置為100
insert into student4 values(100,1002,'zhangwu',null);
//將id置為null
insert into student4 values(null,1003,'zhangliu',null);
結(jié)果
mysql> select *from student4;
+-----+------+----------+---------+
| id  | sn   | name     | qq_mail |
+-----+------+----------+---------+
|   1 | 1000 | zhangsan | NULL    |
|   2 | 1001 | zhangsi  | NULL    |
| 100 | 1002 | zhangwu  | NULL    |
| 101 | 1003 | zhangliu | NULL    |
+-----+------+----------+---------+
4 rows in set (0.00 sec)

可以看出,使用自增長(zhǎng)之后,插入數(shù)據(jù)給值時(shí),用給定的值插入,插入數(shù)據(jù)不給值時(shí),默認(rèn)插入最近一次的最大值+1

5. FOREIGN KEY(外鍵約束)

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

創(chuàng)建一個(gè)班級(jí)表class,id為主鍵.

創(chuàng)建學(xué)生表student,一個(gè)學(xué)生對(duì)應(yīng)一個(gè)班級(jí),一個(gè)班級(jí)對(duì)應(yīng)多個(gè)學(xué)生。使用id為主鍵, classes_id為外鍵,關(guān)聯(lián)班級(jí)表id

create table class(
    id int primary key,
    name varchar(20),
    `desc` VARCHAR(100)
);
Query OK, 0 rows affected (0.03 sec)
mysql> desc class;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id    | int(11)      | NO   | PRI | NULL    |       |
| name  | varchar(20)  | YES  |     | NULL    |       |
| desc  | varchar(100) | YES  |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
create table student5(
    id int primary key auto_increment,
    sn int unique,name varchar(20) default 'unknow',
    qq_mail varchar(20),
    class_id int,
    foreign key(class_id) references class(id)
);
Query OK, 0 rows affected (0.03 sec)
mysql> desc student5;
+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| id       | int(11)     | NO   | PRI | NULL    | auto_increment |
| sn       | int(11)     | YES  | UNI | NULL    |                |
| name     | varchar(20) | YES  |     | unknow  |                |
| qq_mail  | varchar(20) | YES  |     | NULL    |                |
| class_id | int(11)     | YES  | MUL | NULL    |                |
+----------+-------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

此時(shí)學(xué)生表就和班級(jí)表關(guān)聯(lián)起來(lái)了

外鍵約束是兩個(gè)表之間的相互約束

我們插入一個(gè)非法數(shù)據(jù),現(xiàn)在class的id列還是空的,插任何數(shù)據(jù)都會(huì)不合法

insert into student5 values(1,1001,'張三',null,10);
ERROR 1452 (23000): Cannot add or update a child row:
     a foreign key constraint fails (`java_3`.`student5`,
     CONSTRAINT `student5_ibfk_1` FOREIGN KEY (`class_id`) 
    REFERENCES `class` (`id`))

插入失敗,因?yàn)閏lass的id列沒(méi)有10這個(gè)數(shù)據(jù)

說(shuō)明學(xué)生表中的數(shù)據(jù)依賴于班級(jí)表的數(shù)據(jù),班級(jí)表的數(shù)據(jù)對(duì)學(xué)生表的數(shù)據(jù)產(chǎn)生約束力,班級(jí)表為父表,學(xué)生表為子表

我們先給班級(jí)表和學(xué)生表插入數(shù)據(jù)

mysql> insert into class values(1,'java001',null);
Query OK, 1 row affected (0.00 sec)
mysql> insert into student5 values(1,1001,'張三',null,1);
Query OK, 1 row affected (0.00 sec)
mysql> select*from class;
+----+---------+------+
| id | name    | desc |
+----+---------+------+
|  1 | java001 | NULL |
+----+---------+------+
1 row in set (0.00 sec)
mysql> select*from student5;
+----+------+------+---------+----------+
| id | sn   | name | qq_mail | class_id |
+----+------+------+---------+----------+
|  1 | 1001 | 張三 | NULL    |        1 |
+----+------+------+---------+----------+
1 row in set (0.00 sec)

因?yàn)閿?shù)據(jù)都是合法的,所以成功插入

下面舉例說(shuō)明子表也會(huì)反過(guò)來(lái)約束父表

mysql> delete from class where id = 1;
ERROR 1451 (23000): 
Cannot delete or update a parent row: 
    a foreign key constraint fails (`java_3`.`student5`, 
    CONSTRAINT `student5_ibfk_1` FOREIGN KEY (`class_id`) 
    REFERENCES `class` (`id`))

當(dāng)我們刪除班級(jí)表中的數(shù)據(jù)時(shí),發(fā)現(xiàn)刪除失敗

原因是班級(jí)表的數(shù)據(jù)被學(xué)生表給引用了,如果刪除成功,那么子表的數(shù)據(jù)就沒(méi)有意義了

因此父表的數(shù)據(jù)被引用時(shí),是不能刪除的,如果要?jiǎng)h除,就先刪除子表后刪除父表

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

相關(guān)文章

  • Mysql如何對(duì)json數(shù)據(jù)進(jìn)行查詢及修改

    Mysql如何對(duì)json數(shù)據(jù)進(jìn)行查詢及修改

    這篇文章主要介紹了Mysql如何對(duì)json數(shù)據(jù)進(jìn)行查詢及修改,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • 詳解mysql8.018在linux上安裝與配置過(guò)程

    詳解mysql8.018在linux上安裝與配置過(guò)程

    這篇文章主要介紹了mysql8.018在linux上安裝與配置過(guò)程,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-01-01
  • 通過(guò)實(shí)例分析MySQL中的四種事務(wù)隔離級(jí)別

    通過(guò)實(shí)例分析MySQL中的四種事務(wù)隔離級(jí)別

    SQL標(biāo)準(zhǔn)定義了4種隔離級(jí)別,包括了一些具體規(guī)則,用來(lái)限定事務(wù)內(nèi)外的哪些改變是可見(jiàn)的,哪些是不可見(jiàn)的。下面這篇文章通過(guò)實(shí)例詳細(xì)的給大家分析了關(guān)于MySQL中的四種事務(wù)隔離級(jí)別的相關(guān)資料,需要的朋友可以參考下。
    2017-08-08
  • Windows10下mysql 8.0.12 解壓版安裝圖文教程

    Windows10下mysql 8.0.12 解壓版安裝圖文教程

    這篇文章主要為大家詳細(xì)介紹了Windows10下mysql 8.0.12 解壓版安裝圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • MySQL的主鍵命名策略相關(guān)

    MySQL的主鍵命名策略相關(guān)

    這篇文章主要介紹了MySQL的主鍵命名策略的的相關(guān)資料,幫助大家更好的理解和使用MySQL數(shù)據(jù)庫(kù),感興趣的朋友可以了解下
    2021-01-01
  • mysql 8.0.15 安裝圖文教程及數(shù)據(jù)庫(kù)基礎(chǔ)

    mysql 8.0.15 安裝圖文教程及數(shù)據(jù)庫(kù)基礎(chǔ)

    這篇文章主要為大家詳細(xì)介紹了mysql 8.0.15 安裝方法圖文教程,及數(shù)據(jù)庫(kù)基礎(chǔ)知識(shí),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • MYSQL5 masterslave數(shù)據(jù)同步配置方法

    MYSQL5 masterslave數(shù)據(jù)同步配置方法

    因線路或安全需要我們不得不考慮mysql的備份,特把mysql數(shù)據(jù)備份的方法整理下。
    2008-09-09
  • 一文帶你理解MySql中explain結(jié)果filtered

    一文帶你理解MySql中explain結(jié)果filtered

    使用EXPLAIN關(guān)鍵字可以模擬優(yōu)化器執(zhí)行SQL查詢語(yǔ)句,從而知道MySQL是如何處理你的SQL語(yǔ)句的,下面這篇文章主要給大家介紹了關(guān)于MySql中explain結(jié)果filtered的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • MySQL中連接查詢和子查詢的問(wèn)題

    MySQL中連接查詢和子查詢的問(wèn)題

    這篇文章主要介紹了MySQL中連接查詢和子查詢的問(wèn)題,本文通過(guò)實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • MySQL中索引失效的常見(jiàn)場(chǎng)景與規(guī)避方法

    MySQL中索引失效的常見(jiàn)場(chǎng)景與規(guī)避方法

    這篇文章主要給大家介紹了關(guān)于MySQL中索引失效的常見(jiàn)場(chǎng)景與規(guī)避的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用MySQL具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12

最新評(píng)論

沙田区| 丰原市| 保定市| 靖边县| 安化县| 长海县| 宜昌市| 莱西市| 瑞昌市| 绥阳县| 冕宁县| 夏邑县| 万源市| 眉山市| 夏邑县| 牙克石市| 新兴县| 宜黄县| 滦南县| 滦南县| 张家口市| 宁都县| 廉江市| 金秀| 巴楚县| 德州市| 高清| 云浮市| 军事| 惠水县| 睢宁县| 天柱县| 和政县| 新民市| 长汀县| 湘潭县| 长宁县| 保亭| 满城县| 红桥区| 同仁县|