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

MySQL 外鍵約束和表關(guān)系相關(guān)總結(jié)

 更新時(shí)間:2021年06月18日 11:05:44   作者:程序媛小莊  
一個(gè)項(xiàng)目中如果將所有的數(shù)據(jù)都存放在一張表中是不合理的,比如一個(gè)員工信息,公司只有2個(gè)部門(mén),但是員工有1億人,就意味著員工信息這張表中的部門(mén)字段的值需要重復(fù)存儲(chǔ),極大的浪費(fèi)資源,因此可以定義一個(gè)部門(mén)表和員工信息表進(jìn)行關(guān)聯(lián),而關(guān)聯(lián)的方式就是外鍵。

外鍵(Foreign Key)

按照上述所說(shuō),一張表存儲(chǔ)員工信息會(huì)極大的浪費(fèi)資源,重復(fù)數(shù)據(jù)太多,這個(gè)問(wèn)題就類似于將所有的代碼都寫(xiě)在了一個(gè)py文件中,因此我們可以將一個(gè)表拆成不同的表,在這不同的表之間建立關(guān)聯(lián),而建立關(guān)聯(lián)就需要使用外鍵foreign key。外鍵也屬于約束條件的一種。

如何確定表關(guān)系

表與表之間的關(guān)系有三種一對(duì)多、多對(duì)多、一對(duì)一。那么如何確定表與表之間的關(guān)系呢?

在確定表與表之間的關(guān)系時(shí)建議換位思考,什么意思呢?就是分別站在兩張表的角度去考慮,比如員工表和部門(mén)表的關(guān)系:

先站在員工表的角度:?jiǎn)T工表中一個(gè)員工能否屬于多個(gè)部門(mén)呢?答案是不能

再站在部門(mén)表的角度:部門(mén)表中一個(gè)部門(mén)能否有多個(gè)員工呢?答案是可以

因此員工表與部門(mén)表是單向的一對(duì)多,那么員工表和部門(mén)表就是一對(duì)多的關(guān)系。

如何建立表關(guān)系

在建立表關(guān)系時(shí),表與表之間的關(guān)聯(lián)通常以主鍵id作為關(guān)聯(lián)字段。

一對(duì)多關(guān)系 - 員工表和部門(mén)表

在MySQL的關(guān)系在沒(méi)有多對(duì)一的概念,一對(duì)多和多對(duì)一都是一對(duì)多。在創(chuàng)建一對(duì)多表關(guān)系時(shí)需要遵循以下幾點(diǎn):

第一,外鍵字段建立在多的一方,即員工表

第二,在創(chuàng)建表的時(shí)候,一定要先創(chuàng)建被關(guān)聯(lián)一方,即部門(mén)表

第三,在錄入數(shù)據(jù)的時(shí)候也必須先錄入被關(guān)聯(lián)表的數(shù)據(jù),即部門(mén)表的數(shù)據(jù)

第四,當(dāng)不同的表建立關(guān)系時(shí),需要進(jìn)行級(jí)聯(lián)更新和刪除也可以稱為同步更新同步刪除,如果不建立級(jí)聯(lián)更新和刪除的話,無(wú)法對(duì)被關(guān)聯(lián)表中被關(guān)聯(lián)的數(shù)據(jù)進(jìn)行刪除或者修改id的操作,因?yàn)閮蓮埍硎窍嗷リP(guān)聯(lián)的。

-- 創(chuàng)建被關(guān)聯(lián)表,部門(mén)表
mysql> create table bm(
    id int primary key auto_increment, 
    bm_name varchar(10), 
    bm_desc char(64)
);
Query OK, 0 rows affected (0.01 sec)

mysql> desc bm;
+---------+-------------+------+-----+---------+----------------+
| Field   | Type        | Null | Key | Default | Extra          |
+---------+-------------+------+-----+---------+----------------+
| id      | int(11)     | NO   | PRI | NULL    | auto_increment |
| bm_name | varchar(10) | YES  |     | NULL    |                |
| bm_desc | char(64)    | YES  |     | NULL    |                |
+---------+-------------+------+-----+---------+----------------+
3 rows in set (0.01 sec)

-- 創(chuàng)建外鍵所在的表,員工表
mysql> create table yg(
    id int primary key auto_increment, 
    yg_name varchar(6), 
    bm_id int, 
    foreign key(bm_id) references bm(id)  -- 表示bm_id是外鍵字段,關(guān)聯(lián)到bm表中的id字段
    on update cascade  # 級(jí)聯(lián)更新
    on delete cascade  # 級(jí)聯(lián)刪除
);
Query OK, 0 rows affected (0.10 sec)

mysql> desc yg;
+---------+------------+------+-----+---------+----------------+
| Field   | Type       | Null | Key | Default | Extra          |
+---------+------------+------+-----+---------+----------------+
| id      | int(11)    | NO   | PRI | NULL    | auto_increment |
| yg_name | varchar(6) | YES  |     | NULL    |                |
| bm_id   | int(11)    | YES  | MUL | NULL    |                |
+---------+------------+------+-----+---------+----------------+
3 rows in set (0.01 sec)


-- 插入數(shù)據(jù)
mysql> insert into bm (bm_name, bm_desc) values ('python', '人生苦短'),('go', 'let us go');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from bm;
+----+---------+--------------+
| id | bm_name | bm_desc      |
+----+---------+--------------+
|  1 | python  | 人生苦短     |
|  2 | go      | let us go    |
+----+---------+--------------+
2 rows in set (0.00 sec)


mysql> insert into yg (yg_name, bm_id) values ('xu', 1), ('zhuang', 2), ('lili', 1);
Query OK, 3 rows affected (0.09 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select * from yg;
+----+---------+-------+
| id | yg_name | bm_id |
+----+---------+-------+
|  2 | xu      |     1 |
|  3 | zhuang  |     2 |
|  4 | lili    |     1 |
+----+---------+-------+
3 rows in set (0.00 sec)

-- 外鍵關(guān)聯(lián)的數(shù)據(jù)必須在被關(guān)聯(lián)表中存在否則會(huì)報(bào)錯(cuò)哦~
mysql> insert into yg (yg_name, bm_id) values ('xu', 3);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`book_manage`.`yg`, CONSTRAINT `yg_ibfk_1` FOREIGN KEY (`bm_id`) REFERENCES `bm` (`id`))

-- 如果不使用級(jí)聯(lián)更新和刪除的話會(huì)出現(xiàn)下面的錯(cuò)誤,下述的SQL語(yǔ)句后面的文章都會(huì)介紹。。。
mysql> update bm set id=5 where id=2;  -- 將bm表中id=2的記錄改為id=5
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`book_manage`.`yg`, CONSTRAINT `yg_ibfk_1` FOREIGN KEY (`bm_id`) REFERENCES `bm` (`id`))

mysql> delete from bm where id =2;  -- 刪除bm表中id為2的那條記錄
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`book_manage`.`yg`, CONSTRAINT `yg_ibfk_1` FOREIGN KEY (`bm_id`) REFERENCES `bm` (`id`)) 

多對(duì)多

多對(duì)多的關(guān)系以書(shū)籍和作者為例進(jìn)行詳細(xì)介紹,為什么書(shū)籍和作者屬于多對(duì)多的關(guān)系呢?

先站在書(shū)籍表的角度:一本書(shū)是否可以有多個(gè)作者?答案是可以

再站在作者表的角度:一個(gè)作者是否可以寫(xiě)多本書(shū)?答案是可以

書(shū)籍表和作者表是雙向的一對(duì)多那么這兩張表的關(guān)系就是多對(duì)多。

我們先來(lái)創(chuàng)建兩張表:

-- 創(chuàng)建書(shū)籍表
create table book(
    id int primary key auto_increment,
    title varchar(32),
    price int,
    author_id int,
    foreign key(author_id) references author(id)
    on update cascade
    on delete cascade
);

-- 創(chuàng)建作者表
create table author(
    id int primary key auto_increment,
    name varchar(32),
    age int,
    book_id int,
    foreign key(book_id) references book(id)
    on update cascade
    on delete cascade
);

如果按照上述方式創(chuàng)建表的話肯定是不可能成功的,在創(chuàng)建一對(duì)多的表關(guān)系時(shí)我我們說(shuō)要先創(chuàng)建被關(guān)聯(lián)表,也就是沒(méi)有外鍵的表,可是多對(duì)多關(guān)系是雙向的一對(duì)多,每張表中都會(huì)有外鍵的存在,怎么辦呢?解決方案就是創(chuàng)建第三張表,這第三張表用來(lái)專門(mén)存儲(chǔ)多對(duì)多關(guān)系的兩張表的關(guān)聯(lián)。

-- 創(chuàng)建書(shū)籍表
mysql> create table book(
    id int primary key auto_increment, 
    name varchar(10), 
    price int
);
Query OK, 0 rows affected (0.01 sec)

-- 創(chuàng)建作者表
mysql> create table author(
    id int primary key auto_increment, 
    name varchar(6), 
    age int
);
Query OK, 0 rows affected (0.01 sec)


-- 創(chuàng)建第三章表,存儲(chǔ)book和author表的關(guān)聯(lián)關(guān)系
mysql> create table book2author(
    id int primary key auto_increment, 
    author_id int, 
    book_id int, 
    foreign key(author_id) references author(id) 
    on update cascade 
    on delete cascade, 	
    foreign key(book_id) references book(id) 
    on update cascade 
    on delete cascade);
Query OK, 0 rows affected (0.02 sec)

一對(duì)一

如果一張表的字段特別多,每次查詢數(shù)據(jù)時(shí)又不是所有的字段都能用的到,我們就可以將表一一分為二,比如說(shuō)用戶信息表,用戶的信息包括用戶名 密碼 用戶的年齡 用戶的性別 地址 電話等等,可能經(jīng)常用的只有用戶的用戶名和密碼,這種情況我們就可以將一張用戶信息表拆分成用戶基本信息表和用戶詳細(xì)信息表,同樣判斷這兩張表的關(guān)系還是通過(guò)換位思考:

首先看用戶基本信息表:一個(gè)用戶能否有多個(gè)詳細(xì)信息?答案是不可以;

再看用戶詳情表:一個(gè)用戶詳情能否屬于多個(gè)用戶?答案是不可以;

單向的一對(duì)多都不成立,那么兩者之間的表關(guān)系就是一對(duì)一或者沒(méi)有關(guān)系。

使用SQL語(yǔ)句建立一對(duì)一的外鍵關(guān)系時(shí),外鍵建在任意一方都可以,但是推薦將外鍵建在查詢頻率較高的表中,同樣的,在創(chuàng)建表時(shí)還是先創(chuàng)建被關(guān)聯(lián)表。

-- 創(chuàng)建用戶詳情表
create table authordetail(
	id int primary key auto_increment,
	phone int,
	addr varchar(64)
);

-- 用戶基本信息表
create table author(
	id int primary key auto_increment,
    name varchar(32),
    age int,
    authordetali_id int,
    foreign key(authordetali_id) references authordetali(id)
    on update cascade
    on delete cascade
);

表關(guān)系總結(jié)

表關(guān)系建立需要使用外鍵foreign key,判斷表與表之間的關(guān)系通過(guò)換位思考的方式。

一對(duì)多表關(guān)系:外鍵建在多的一方

一對(duì)一表關(guān)系:外鍵建在任意一方都可以,推薦建在查詢頻率高的一方

多對(duì)多表關(guān)系:需要單獨(dú)創(chuàng)建第三張表存儲(chǔ)兩張表的關(guān)聯(lián)關(guān)系

以上就是MySQL 外鍵約束和表關(guān)系相關(guān)總結(jié)的詳細(xì)內(nèi)容,更多關(guān)于MySQL 外鍵約束和表關(guān)系的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Mysql區(qū)間分組查詢的實(shí)現(xiàn)方式

    Mysql區(qū)間分組查詢的實(shí)現(xiàn)方式

    這篇文章主要介紹了Mysql區(qū)間分組查詢的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • SQL實(shí)戰(zhàn)演練之網(wǎng)上商城數(shù)據(jù)庫(kù)商品類別數(shù)據(jù)操作

    SQL實(shí)戰(zhàn)演練之網(wǎng)上商城數(shù)據(jù)庫(kù)商品類別數(shù)據(jù)操作

    一直認(rèn)為,扎實(shí)的SQL功底是一名數(shù)據(jù)分析師的安身立命之本,甚至可以稱得上是所有數(shù)據(jù)從業(yè)者的基本功。當(dāng)然,這里的SQL絕不單單是寫(xiě)幾條查詢語(yǔ)句那么簡(jiǎn)單,接下來(lái)請(qǐng)跟著小編通過(guò)案例項(xiàng)目演練一遍商品類別的數(shù)據(jù)操作吧
    2021-10-10
  • 解決MySQL因不能創(chuàng)建臨時(shí)文件而導(dǎo)致無(wú)法啟動(dòng)的方法

    解決MySQL因不能創(chuàng)建臨時(shí)文件而導(dǎo)致無(wú)法啟動(dòng)的方法

    這篇文章主要跟大家介紹了關(guān)于解決MySQL因不能創(chuàng)建臨時(shí)文件而導(dǎo)致無(wú)法啟動(dòng)的方法,文中通過(guò)示例代碼介紹了詳細(xì)的解決方法,對(duì)大家具有一定的的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。
    2017-06-06
  • Mysql刪除數(shù)據(jù)以及數(shù)據(jù)表的方法實(shí)例

    Mysql刪除數(shù)據(jù)以及數(shù)據(jù)表的方法實(shí)例

    這篇文章主要給大家介紹了關(guān)于Mysql刪除數(shù)據(jù)以及數(shù)據(jù)表的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • 使用java處理字符串公式運(yùn)算的方法

    使用java處理字符串公式運(yùn)算的方法

    本篇文章介紹了,使用java處理字符串公式運(yùn)算的方法。需要的朋友參考下
    2013-04-04
  • Mysql自增主鍵id不是以此逐級(jí)遞增的處理

    Mysql自增主鍵id不是以此逐級(jí)遞增的處理

    這篇文章主要介紹了Mysql自增主鍵id不是以此逐級(jí)遞增的處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • 詳解MySQL中的事務(wù)與ACID特性

    詳解MySQL中的事務(wù)與ACID特性

    這篇文章主要為大家介紹了Mysql?中的事務(wù),包括事務(wù)的基本概念和?ACID?特性、事務(wù)的隔離級(jí)別和具體實(shí)現(xiàn)方法等,并提供相應(yīng)的代碼示例,希望對(duì)大家有所幫助
    2023-05-05
  • MySQL中的行級(jí)鎖詳解

    MySQL中的行級(jí)鎖詳解

    MySQL中的行級(jí)鎖是InnoDB存儲(chǔ)引擎提供的一種細(xì)粒度鎖,基于索引實(shí)現(xiàn),MySQL中鎖有很多種,其中從鎖的粒度來(lái)區(qū)分的話可以分為表級(jí)鎖,行級(jí)鎖,頁(yè)級(jí)鎖,本文主要介紹MySQL中的行級(jí)鎖,感興趣的朋友一起看看吧
    2025-03-03
  • mysql分區(qū)表學(xué)習(xí)之日期分區(qū)

    mysql分區(qū)表學(xué)習(xí)之日期分區(qū)

    這篇文章主要給大家介紹了關(guān)于mysql分區(qū)表學(xué)習(xí)之日期分區(qū)的相關(guān)資料,分區(qū)是一種表的設(shè)計(jì)模式,通俗地講表分區(qū)是將一大表,根據(jù)條件分割成若干個(gè)小表,需要的朋友可以參考下
    2023-08-08
  • mysql 日期和時(shí)間函數(shù)

    mysql 日期和時(shí)間函數(shù)

    這里是一個(gè)使用日期函數(shù)的例子。下面的查詢選擇所有 date_col 值在最后 30 天內(nèi)的記錄。
    2009-11-11

最新評(píng)論

万荣县| 青铜峡市| 农安县| 湘阴县| 尖扎县| 师宗县| 兴安县| 大名县| 辽宁省| 河津市| 黄石市| 秦安县| 方山县| 会宁县| 铅山县| 宜宾县| 江门市| 威宁| 博兴县| 巩义市| 东乡县| 泸溪县| 高淳县| 德令哈市| 寿阳县| 大姚县| 永川市| 连州市| 阜阳市| 曲水县| 土默特左旗| 林州市| 务川| 黄浦区| 张北县| 淅川县| 延川县| 岳池县| 西峡县| 北海市| 夹江县|