业务需求:用户表r_user保存用户名等信息。现需要给每个用户设置工作基地,一个用户可以有多个工作基地,多个用户也可以有一个工作基地,即多对多关系。(外键,若有两个表A,B,C是A的主键,而B中也有C字段,则C就是表B的外键,外键约束主要用来维护两个表之间数据的一致性)

设计方案:

方案一:建立一张用户基地表,与r_user与用户基地表,保持一对多的关系,如图所示,r_user的主键id做为r_user_base的外键user_id。通过r_user中的id,在r_user_base表中load该用户的所有工作基地。

方案二:建立一张个基地表base_info保存目前存在的所有基地,再建一张user_base关系表。如图所示,关系表user_base有两个外键user_id与base_id

方案一的特点是,只需要键一张表就可以完成业务需求。缺点是不够模块化,如果在其它地方还要用到基地信息,则还要再建基地表

方案二的特点是,用一张关系表连接两张信息表。便于信息表的维护与重复利用。

基于业务需求与以后扩展及重用性考虑,采用方案二实现需求。

在MySQL 3.23.44版本后,InnoDB引擎类型的表支持了外键约束。

外键的使用条件:

1.两个表必须是InnoDB表,MyISAM表暂时不支持外键(据说以后的版本有可能支持,但至少目前不支持);

2.外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显示建立;

3.外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列,比如int和tinyint可以,而int和char则不可以;

外键的定义语法:

[CONSTRAINT symbol] FOREIGN KEY [id] (index_col_name, ...)

REFERENCES tbl_name (index_col_name, ...)

[ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]

[ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]

 cascade方式 

在父表上update/delete记录时,同步update/delete掉子表的匹配记录 
   On delete cascade从mysql3.23.50开始可用; on update cascade从mysql4.0.8开始可用 。

set null方式 

在父表上update/delete记录时,将子表上匹配记录的列设为null

要注意子表的外键列不能为not null

On delete set null从mysql3.23.50开始可用; on update set null从mysql4.0.8开始可用 
No action方式

如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作 
   这个是ANSI SQL-92标准,从mysql4.0.8开始支持 
Restrict方式 

同no action, 都是立即检查外键约束

建立人员信息表:

1 CREATE TABLE `r_user` (
2   `id` bigint(20) NOT NULL AUTO_INCREMENT,
3   `NAME` varchar(20) DEFAULT NULL,
4   `PASSWORD` varchar(50) DEFAULT NULL,
5   `STAFF_NUM` varchar(20) DEFAULT NULL,
6    `USER_NAME` varchar(20) DEFAULT NULL,
7   PRIMARY KEY (`id`),
8   ) ENGINE=InnoDB AUTO_INCREMENT=54 DEFAULT CHARSET=utf8 

建立基地信息表

1 CREATE TABLE `branch_info` (
2   `ID` bigint(20) NOT NULL AUTO_INCREMENT,
3    `BRANCH_CODE` varchar(255) DEFAULT NULL,
4   `BRANCH_DESC` varchar(255) DEFAULT NULL,
5   PRIMARY KEY (`ID`)
6 ) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8 

关系表:

1 CREATE TABLE `user_work_base` (
2   `id` bigint(20) NOT NULL AUTO_INCREMENT,
3   `version` int(11) NOT NULL,
4   `user_id` bigint(20) NOT NULL ,
5   `base_id` bigint(20) NOT NULL ,
6   PRIMARY KEY (`id`),
7   CONSTRAINT `user_work_base_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `r_user` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
8   CONSTRAINT `user_work_base_ibfk_2` FOREIGN KEY (`base_id`) REFERENCES `branch_info` (`ID`) ON DELETE CASCADE ON UPDATE CASCADE
9 ) ENGINE=InnoDB AUTO_INCREMENT=37 DEFAULT CHARSET=utf8

删除人员r_user表中人员A,关系表user_base自动删除A的关系数据。

如果外键使用Restrict方式,只删除A,则报错。

Cannot delete or update a parent row: a foreign key constraint fails (`maircrew`,`user_work_base`, CONSTRAINT `FK41EB46D32AA89EA0`

FOREIGN KEY (`user_id`) REFERENCES `r_user` (`id`))

转载于:https://www.cnblogs.com/pfxiong/p/3275020.html

MySql多对多关系中外键的应用相关推荐

  1. mysql添加约束_fk_MySQL中外键的创建、约束以及删除

    前言 在MySQL 3.23.44版本后,InnoDB引擎类型的表支持了外键约束. 外键的使用条件: 1.两个表必须是InnoDB表,MyISAM表暂时不支持外键(据说以后的版本有可能支持,但至少目前 ...

  2. Mysql多对多关系利用中间表查询

    1.多对多关系,我们举个简单的例子,一个顾客可以买多件商品,同时一类商品(指多件相同的商品)也可以也可以让多个用户购买 下面是对应的表,用户表,商品表以及关系表,其中关系表中userId.metId的 ...

  3. mysql多对多关系的理解,由一对多看向多对多

    先看一对多 学生表 create table student(      id int primary key auto_increment,      name varchar(20) ); 一个班 ...

  4. 为什么在mysql执行删除表中外键的语句,外键却仍然存在? [问题点数:40分]

    1.MYSQL在建外键后,会自动建一个同名的索引 2.而删除外键的时候,这个同名索引如果没被删,则MYSQL认为外键 所以你删除了外键,再查询,因为有同名索引在,因此还能看到, 如果再执行一次删除同名 ...

  5. navicat 8 mysql生成关系_MySQL数据库通过navicat建立多对多关系

    ** 构建两张表的多对多关系:清洗数据表(clean_data表)与用户表(user表)建立多对多的关系.如下图图0所示 图0 多对多之间关系 1 创建表 .打开navicat,创建三张表,clean ...

  6. java中mysql分组查询_ES对应mysql的group by分组查询javaApi,多对多关系的分组查询...

    ES对应mysql的group by分组查询javaApi,多对多关系的分组查询 比如我这边有个下列订单索引数据,现在的需求是按用户(fmerchantId)和支付方式(fchannelId)进行分组 ...

  7. 2019-7-27 [MySQL] DQL 简单查询[别名/去重/运算] 条件查询 排序查询 聚合查询 分组查询 导出与导入 多表操作[一对多/多对多][创外键 创联合主键 约束 添加 删除 测试]

    文章目录 5 SQL语句(DQL) 5.1DQL准备工作和语法 5.1.1准备工作 5.1.2 DQL语法: 5.2 简单查询 5.2.1 查询所有的商品 5.2.2 查询商品名和商品价格. 5.2. ...

  8. Mysql中外键作用以及Navicat建立外键失败总结

    本文摘自参考三篇文章,从这篇文章中将了解到外键作用以及navicat建立外键常见错误解决,帮助读者更加深刻了解外键. 文章目录 一.外键的作用 二. 不设置外键行不行? 三.那到底使不使用外键? 四. ...

  9. mysql 外部键约束名_MySQL中外键的创建、约束以及删除

    前言 在MySQL 3.23.44版本后,InnoDB引擎类型的表支持了外键约束. 外键的使用条件: 1.两个表必须是InnoDB表,MyISAM表暂时不支持外键(据说以后的版本有可能支持,但至少目前 ...

  10. 【MySql】8.多对多关系表

    多对多关系: 比如在常见的订单管理数据库当中"产品"表和"订单"表之间的关系.单个订单中可以包含多个产品.另一方面,一个产品可能出现在多个订单中.因此,对于&q ...

最新文章

  1. node--静态服务器
  2. Linux 查看内存状态
  3. UIMenuController在label中的使用
  4. C#基础(四)--值类型和引用类型,栈和堆的含义
  5. C# WinForm 给某动态控件设置 IsBalloon = true的ToolTip 即 气泡状提示
  6. 主流JS框架中DOMReady事件的实现
  7. 很多的Adobe Dreamweaver CS5序列号
  8. MSM8960 // F200 引导装载程序 (Bootloader) 之研读
  9. Mongodb 设置过期时间Expire Date
  10. 佳能6d2无线链接计算机操作,玩转EOS 6D无线WiFi功能三步骤
  11. 很好的励志文章(特别针对刚刚进入职场的毕业生而写)
  12. mindmanager 15 停止工作
  13. Mysql索引有哪几种类型
  14. GCN:图卷积神经网络
  15. 180101 逆向-64位处理器
  16. XSS能有什么危害?
  17. ADC0809检测报警c语言,51单片机ADC0809+AD590温度检测、报警程序
  18. windows未服务器未响应,windows不服务器未响应
  19. Windows系统文件快捷链接(软链接/硬链接/符号链接)mklink
  20. OpenGL.Shader:2-Android Cpp下加载assets图片资源 / 各种格式加载纹理 / 在线找AndroidNative源码

热门文章

  1. 你应该知道的一些 ADB 命令
  2. 精通~Scrum为什么会转型困难
  3. loj #6013. 「网络流 24 题」负载平衡
  4. 9.Android之日期对话框DatePicker控件学习
  5. webWMS开发过程记录(三)- 需求分析(略)
  6. 20个非常棒的Jquery实用工具
  7. 学习JavaScript原型应用
  8. 第一次使用博客及Coursera课程体验
  9. 敏捷软件开发VS传统软件开发
  10. MVC中Action参数绑定的过程