电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

MySQL 外鍵約束和表關系相關總結

瀏覽:7日期:2023-10-01 15:40:35
目錄外鍵(Foreign Key)如何確定表關系如何建立表關系一對多關系 - 員工表和部門表多對多一對一表關系總結外鍵(Foreign Key)

按照上述所說,一張表存儲員工信息會極大的浪費資源,重復數據太多,這個問題就類似于將所有的代碼都寫在了一個py文件中,因此我們可以將一個表拆成不同的表,在這不同的表之間建立關聯,而建立關聯就需要使用外鍵foreign key。外鍵也屬于約束條件的一種。

如何確定表關系

表與表之間的關系有三種一對多、多對多、一對一。那么如何確定表與表之間的關系呢?

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

先站在員工表的角度:員工表中一個員工能否屬于多個部門呢?答案是不能

再站在部門表的角度:部門表中一個部門能否有多個員工呢?答案是可以

因此員工表與部門表是單向的一對多,那么員工表和部門表就是一對多的關系。

如何建立表關系

在建立表關系時,表與表之間的關聯通常以主鍵id作為關聯字段。

一對多關系 - 員工表和部門表

在MySQL的關系在沒有多對一的概念,一對多和多對一都是一對多。在創建一對多表關系時需要遵循以下幾點:

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

第二,在創建表的時候,一定要先創建被關聯一方,即部門表

第三,在錄入數據的時候也必須先錄入被關聯表的數據,即部門表的數據

第四,當不同的表建立關系時,需要進行級聯更新和刪除也可以稱為同步更新同步刪除,如果不建立級聯更新和刪除的話,無法對被關聯表中被關聯的數據進行刪除或者修改id的操作,因為兩張表是相互關聯的。

-- 創建被關聯表,部門表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)-- 創建外鍵所在的表,員工表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是外鍵字段,關聯到bm表中的id字段 on update cascade # 級聯更新 on delete cascade # 級聯刪除);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)-- 插入數據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: 0mysql> 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: 0mysql> select * from yg;+----+---------+-------+| id | yg_name | bm_id |+----+---------+-------+| 2 | xu | 1 || 3 | zhuang | 2 || 4 | lili | 1 |+----+---------+-------+3 rows in set (0.00 sec)-- 外鍵關聯的數據必須在被關聯表中存在否則會報錯哦~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`))-- 如果不使用級聯更新和刪除的話會出現下面的錯誤,下述的SQL語句后面的文章都會介紹。。。mysql> update bm set id=5 where id=2; -- 將bm表中id=2的記錄改為id=5ERROR 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`)) 多對多

多對多的關系以書籍和作者為例進行詳細介紹,為什么書籍和作者屬于多對多的關系呢?

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

再站在作者表的角度:一個作者是否可以寫多本書?答案是可以

書籍表和作者表是雙向的一對多那么這兩張表的關系就是多對多。

我們先來創建兩張表:

-- 創建書籍表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);-- 創建作者表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);

如果按照上述方式創建表的話肯定是不可能成功的,在創建一對多的表關系時我我們說要先創建被關聯表,也就是沒有外鍵的表,可是多對多關系是雙向的一對多,每張表中都會有外鍵的存在,怎么辦呢?解決方案就是創建第三張表,這第三張表用來專門存儲多對多關系的兩張表的關聯。

-- 創建書籍表mysql> create table book( id int primary key auto_increment, name varchar(10), price int);Query OK, 0 rows affected (0.01 sec)-- 創建作者表mysql> create table author( id int primary key auto_increment, name varchar(6), age int);Query OK, 0 rows affected (0.01 sec)-- 創建第三章表,存儲book和author表的關聯關系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)一對一

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

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

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

單向的一對多都不成立,那么兩者之間的表關系就是一對一或者沒有關系。

使用SQL語句建立一對一的外鍵關系時,外鍵建在任意一方都可以,但是推薦將外鍵建在查詢頻率較高的表中,同樣的,在創建表時還是先創建被關聯表。

-- 創建用戶詳情表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);表關系總結

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

一對多表關系:外鍵建在多的一方

一對一表關系:外鍵建在任意一方都可以,推薦建在查詢頻率高的一方

多對多表關系:需要單獨創建第三張表存儲兩張表的關聯關系

以上就是MySQL 外鍵約束和表關系相關總結的詳細內容,更多關于MySQL 外鍵約束和表關系的資料請關注好吧啦網其它相關文章!

標簽: MySQL 數據庫
相關文章:
主站蜘蛛池模板: 京港视通报道-质量走进大江南北-京港视通传媒[北京]有限公司 | 儿童乐园|游乐场|淘气堡招商加盟|室内儿童游乐园配套设备|生产厂家|开心哈乐儿童乐园 | 高中学习网-高考生信息学习必备平台 | 聚氨酯催化剂K15,延迟催化剂SA-1,叔胺延迟催化剂,DBU,二甲基哌嗪,催化剂TMR-2,-聚氨酯催化剂生产厂家 | KBX-220倾斜开关|KBW-220P/L跑偏开关|拉绳开关|DHJY-I隔爆打滑开关|溜槽堵塞开关|欠速开关|声光报警器-山东卓信有限公司 | 打包箱房_集成房屋-山东佳一集成房屋有限公司 | 紫外可见光分光度计-紫外分光度计-分光光度仪-屹谱仪器制造(上海)有限公司 | 氟氨基酮、氯硝柳胺、2-氟苯甲酸、异香兰素-新晨化工 | 北京成考网-北京成人高考网 | 北京晚会活动策划|北京节目录制后期剪辑|北京演播厅出租租赁-北京龙视星光文化传媒有限公司 | 喷码机,激光喷码打码机,鸡蛋打码机,手持打码机,自动喷码机,一物一码防伪溯源-恒欣瑞达有限公司 | 红酒招商加盟-葡萄酒加盟-进口红酒代理-青岛枞木酒业有限公司 | 河南中专学校|职高|技校招生-河南中职中专网| 武汉创亿电气设备有限公司_电力检测设备生产厂家 | 机房监控|动环监控|动力环境监控系统方案产品定制厂家 - 迈世OMARA | 自动气象站_农业气象站_超声波气象站_防爆气象站-山东万象环境科技有限公司 | 塑料异型材_PVC异型材_封边条生产厂家_PC灯罩_防撞扶手_医院扶手价格_东莞市怡美塑胶制品有限公司 | 爱佩恒温恒湿测试箱|高低温实验箱|高低温冲击试验箱|冷热冲击试验箱-您身边的模拟环境试验设备技术专家-合作热线:400-6727-800-广东爱佩试验设备有限公司 | crm客户关系管理系统,销售管理系统,crm系统,在线crm,移动crm系统 - 爱客crm | 卫生纸复卷机|抽纸机|卫生纸加工设备|做卫生纸机器|小型卫生纸加工需要什么设备|卫生纸机器设备多少钱一台|许昌恒源纸品机械有限公司 | 齿辊分级破碎机,高低压压球机,立式双动力磨粉机-郑州长城冶金设备有限公司 | 医用酒精_84消毒液_碘伏消毒液等医用消毒液-漓峰消毒官网 | 胶水,胶粘剂,AB胶,环氧胶,UV胶水,高温胶,快干胶,密封胶,结构胶,电子胶,厌氧胶,高温胶水,电子胶水-东莞聚力-聚厉胶粘 | 家庭教育吧-在线家庭教育平台,专注青少年家庭教育 | 大通天成企业资质代办_承装修试电力设施许可证_增值电信业务经营许可证_无人机运营合格证_广播电视节目制作许可证 | 出国劳务公司_正规派遣公司[严海] | 干法制粒机_智能干法制粒机_张家港市开创机械制造有限公司 | 钢衬四氟管道_钢衬四氟直管_聚四氟乙烯衬里管件_聚四氟乙烯衬里管道-沧州汇霖管道科技有限公司 | 塑料脸盆批发,塑料盆生产厂家,临沂塑料广告盆,临沂家用塑料盆-临沂市永顺塑业 | 洁净实验室工程-成都手术室净化-无尘车间装修-四川华锐净化公司-洁净室专业厂家 | 蓄电池回收,ups电池后备电源回收,铅酸蓄电池回收,机房电源回收-广州益夫铅酸电池回收公司 | 恒温水槽与水浴锅-上海熙浩实业有限公司| SEO网站优化,关键词排名优化,苏州网站推广-江苏森歌网络 | 山东集装箱活动房|济南集装箱活动房-济南利森集装箱有限公司 | 冷油器,取样冷却器,热力除氧器-连云港振辉机械设备有限公司 | 托利多电子平台秤-高精度接线盒-托利多高精度电子秤|百科 | 天津次氯酸钠酸钙溶液-天津氢氧化钠厂家-天津市辅仁化工有限公司 | 吸音板,隔音板,吸音材料,吸音板价格,声学材料 - 佛山诺声吸音板厂家 | 药品冷藏箱厂家_低温冰箱_洁净工作台-济南欧莱博电子商务有限公司官网 | 涡轮流量计_LWGY智能气体液体电池供电计量表-金湖凯铭仪表有限公司 | 玉米加工设备,玉米深加工机械,玉米糁加工设备.玉米脱皮制糁机 华豫万通粮机 |