【MySQL】外键的变种

"

目录

三种关系

多对一

多对多

一对一



因为有foreign key的约束,使得两张表形成了三种关系:

  • 多对一
  • 多对多
  • 一对多

重点理解如何找出两张表之间的关系

现在有A、B两张表

分析步骤:

1. 先站在A表的角度去找
:是否A表的多条记录可以对应B表的一条记录,如果是,则证明A表的一个字段 foreign key B表的一个字段(通常是id).

2. 再站在B表的角度去找
:是否B表的多条记录可以对应A表的一条记录,如果是,则证明B表的一个字段 foreign key A表的一个字段(通常是id).

3. 总结:
多对一
如果是步骤1成立,则是A表多对一B表

如果是步骤2成立,则是B表多对一A表

多对多
如果步骤1和步骤2同时成立,则证明这两张表是一个双向的多对一,即多对多,需要定义一个这两张表的关系表来专门存放二者的关系.

一对一
如果1和2都不成立,而是A表的一条记录唯一对应B表的一条记录,反之亦然。这种情况很简单,就是在A表 foreign key B表的基础上,将A表的外键字段设置成unique即可



三种关系

多对一

或者说是一对多

举例:书和出版社

一个出版社可以出版多本书,请看图:

![在这里插入图片描述](/media/ai/2019-03/463fea85-f6a4-4305-aff5-587f53b643e2.png)


  1. # 创建出版社表
  2. mysql> create table press(
  3. -> id int primary key auto_increment,
  4. -> name varchar(20)
  5. -> );
  6. Query OK, 0 rows affected (0.07 sec)
  7. # 创建书籍表
  8. mysql> create table book(
  9. -> id int primary key auto_increment,
  10. -> name varchar(20),
  11. -> press_id int not null,
  12. -> constraint fk_book_press foreign key(press_id) references press(id)
  13. -> on delete cascade
  14. -> on update cascade
  15. -> );
  16. Query OK, 0 rows affected (0.05 sec)
  17. # 先往被关联表中插入记录
  18. mysql> insert into press(name) values
  19. -> (‘北京工业地雷出版社‘),
  20. -> (‘人民音乐不好听出版社‘),
  21. -> (‘知识产权没有用出版社‘);
  22. Query OK, 3 rows affected (0.00 sec)
  23. Records: 3 Duplicates: 0 Warnings: 0
  24. # 再往关联表中插入记录
  25. mysql> insert into book(name, press_id) values
  26. -> (‘九阳神功‘,1),
  27. -> (‘九阴真经‘,2),
  28. -> (‘九阴白骨爪‘,2),
  29. -> (‘独孤九剑‘,3),
  30. -> (‘降龙十巴掌‘,2),
  31. -> (‘葵花宝典‘,3);
  32. Query OK, 6 rows affected (0.04 sec)
  33. Records: 6 Duplicates: 0 Warnings: 0
  34. # 查询结果
  35. mysql> select * from book;
  36. +----+-----------------+----------+
  37. | id | name | press_id |
  38. +----+-----------------+----------+
  39. | 1 | 九阳神功 | 1 |
  40. | 2 | 九阴真经 | 2 |
  41. | 3 | 九阴白骨爪 | 2 |
  42. | 4 | 独孤九剑 | 3 |
  43. | 5 | 降龙十巴掌 | 2 |
  44. | 6 | 葵花宝典 | 3 |
  45. +----+-----------------+----------+
  46. 6 rows in set (0.00 sec)
  47. mysql> select * from press;
  48. +----+--------------------------------+
  49. | id | name |
  50. +----+--------------------------------+
  51. | 1 | 北京工业地雷出版社 |
  52. | 2 | 人民音乐不好听出版社 |
  53. | 3 | 知识产权没有用出版社 |
  54. +----+--------------------------------+
  55. 3 rows in set (0.00 sec)

多对多

举例:作者和书籍的关系

一个作者可以写多本书,一本书也可以有多个作者,即多对多。请看图:

![在这里插入图片描述](/media/ai/2019-03/67921b80-a73c-4aed-89b3-dcbced259f18.png)


  1. # 创建书籍表
  2. mysql> create table book(
  3. -> id int primary key auto_increment,
  4. -> name varchar(20)
  5. -> );
  6. Query OK, 0 rows affected (0.06 sec)
  7. # 创建作者表
  8. mysql> create table author(
  9. -> id int primary key auto_increment,
  10. -> name varchar(20)
  11. -> );
  12. Query OK, 0 rows affected (0.18 sec)
  13. # 这张表用于记录author表与book表的关系
  14. mysql> create table author2book(
  15. -> id int not null unique auto_increment,
  16. -> author_id int not null,
  17. -> book_id int not null,
  18. -> constraint fk_author foreign key(author_id) references author(id)
  19. -> on delete cascade
  20. -> on update cascade,
  21. -> constraint fk_book foreign key(book_id) references book(id)
  22. -> on delete cascade
  23. -> on update cascade,
  24. -> primary key(author_id,book_id)
  25. -> );
  26. Query OK, 0 rows affected (0.09 sec)
  27. # 插入记录
  28. mysql> insert into author(name) values(‘egon‘), (‘alex‘), (‘wusir‘), (‘yuanhao‘);
  29. Query OK, 4 rows affected (0.00 sec)
  30. Records: 4 Duplicates: 0 Warnings: 0
  31. mysql> insert into book(name) values(‘Python全栈‘), (‘Linux高级运维‘), (‘爬虫技术‘), (‘Web前端‘);
  32. Query OK, 4 rows affected (0.01 sec)
  33. Records: 4 Duplicates: 0 Warnings: 0
  34. # 插入作者与书籍的对应关系
  35. mysql> insert into author2book(author_id, book_id) values
  36. -> (1, 1),
  37. -> (1, 2),
  38. -> (2, 1),
  39. -> (3, 1),
  40. -> (4, 4),
  41. -> (4, 3);
  42. Query OK, 6 rows affected (0.04 sec)
  43. Records: 6 Duplicates: 0 Warnings: 0
  44. mysql> select * from author2book;
  45. +----+-----------+---------+
  46. | id | author_id | book_id |
  47. +----+-----------+---------+
  48. | 1 | 1 | 1 |
  49. | 2 | 1 | 2 |
  50. | 3 | 2 | 1 |
  51. | 4 | 3 | 1 |
  52. | 5 | 4 | 4 |
  53. | 6 | 4 | 3 |
  54. +----+-----------+---------+
  55. 6 rows in set (0.00 sec)

一对一

举例:用户和博客

一个用户只能注册一个博客,即一对一的关系,请看图:

![在这里插入图片描述](/media/ai/2019-03/939923a5-6aab-4aa4-b47b-1f9c71a5e598.png)


  1. # 创建用户表
  2. mysql> create table user(
  3. -> id int primary key auto_increment,
  4. -> name varchar(20)
  5. -> );
  6. Query OK, 0 rows affected (0.11 sec)
  7. # 创建博客表
  8. mysql> create table blog(
  9. -> id int primary key auto_increment,
  10. -> url varchar(100),
  11. -> user_id int unique,
  12. -> constraint fk_user foreign key(user_id) references user(id)
  13. -> on delete cascade
  14. -> on update cascade
  15. -> );
  16. Query OK, 0 rows affected (0.08 sec)
  17. # 插入用户表中的记录
  18. mysql> insert into user(name) values(‘alex‘), (‘wusir‘), (‘egon‘), (‘xiaoma‘);
  19. Query OK, 4 rows affected (0.04 sec)
  20. Records: 4 Duplicates: 0 Warnings: 0
  21. # 插入博客表的记录
  22. mysql> insert into blog(url, user_id) values
  23. -> (‘http:/blog.csdn.net/alex‘, 1),
  24. -> (‘http:/blog.csdn.net/wusir‘, 2),
  25. -> (‘http:/blog.csdn.net/egon‘, 3),
  26. -> (‘http:/blog.csdn.net/xiaoma‘, 4);
  27. Query OK, 4 rows affected (0.00 sec)
  28. Records: 4 Duplicates: 0 Warnings: 0
  29. # 查找wusir的博客地址
  30. mysql> select url from blog where user_id=2;
  31. +---------------------------+
  32. | url |
  33. +---------------------------+
  34. | http:/blog.csdn.net/wusir |
  35. +---------------------------+
  36. 1 row in set (0.00 sec)


"

原文地址:https://www.cnblogs.com/zyk01/p/11375925.html

时间: 2024-11-01 20:20:24

【MySQL】外键的变种的相关文章

Mysql外键的变种 三种关系

一.介绍 因为有foreign key的约束,使得两张表形成了三种了关系: 多对一 多对多 一对一 二.重点理解如果找出两张表之间的关系 分析步骤: #1.先站在左表的角度去找 是否左表的多条记录可以对应右表的一条记录,如果是,则证明左表的一个字段foreign key 右表一个字段(通常是id) #2.再站在右表的角度去找 是否右表的多条记录可以对应左表的一条记录,如果是,则证明右表的一个字段foreign key 左表一个字段(通常是id) #3.总结: #多对一: 如果只有步骤1成立,则是

python42 1.外键的变种 2.数据表操作

昨日回顾: 一. 数据库的介绍   管理数据的软件 二. 数据库的 分类:   a.关系型数据库    有约束   b.非关系型数据库    没有约束     三. MySQl 的安装:   a. exe msi文件 点击下一步下一步      b. 压缩包     bin      mysqld : 启动mysql服务的     mysql  : 连接mysql    环境变量 四. 数据库(文件夹)   数据表 (文件)    数据行(文件行)  五. 数据库:   增:    create

MySQL外键设置中的的 Cascade、NO ACTION、Restrict、SET NULL

MySQL外键设置中的的属性含义: cascade方式 在父表上update/delete记录时,同步update/delete掉子表的匹配记录 set null方式 在父表上update/delete记录时,将子表上匹配记录的列设为null 要注意子表的外键列不能为not null No action方式 如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作 Restrict方式 同no action, 都是立即检查外键约束 Set default方式 父表有变更

4Python全栈之路系列之MYSQL外键

Python全栈之路系列之MySQL外键 先来个例子来说明什么是外键以及外键的作用,so,XO公司现正处于一种迅速发展的状态,从最初的12人的团队发展到现在的300人,那么问题就来了,发展的越快,人员与部门就越来越多,这是老大要求我们做一个人员管理系统,用于查询入职人员的信息等. 起初我们想用一个表来实现所有的人员统计,创建Personnel库,用于存放公司员工的信息,指令如下: CREATE DATABASE personnel DEFAULT CHARSET utf8 COLLATE utf

mysql外键使用和事物使用

mysql外键功能主要是为了保证关联表数据的一致性,主要目的是控制存储在外键表中的数据. 使两张表形成关联,外键只能引用外表中的列的值! 例如: a b 两个表 a表中存有 客户号,客户名称 b表中存有 每个客户的订单 有了外键后 你只能在确信b 表中没有客户x的订单后,才可以在a表中删除客户x 建立外键的前提: 本表的列必须与外键类型相同(外键必须是外表主键). 指定主键关键字: foreign key(列名) 引用外键关键字: references <外键表名>(外键列名) 事件触发限制:

【转】MySQL外键约束On Delete、On Update各取值的含义

转载地址:http://hi.baidu.com/jxqlovejava/item/3d2cc5b5d689917c244b0920 ? 先看On Delete属性,可能取值如上图为:No Action, Cascade,Set Null, Restrict属性. 当取值为No Action或者Restrict时,则当在父表(即外键的来源表)中删除对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除. 当取值为Cascade时,则当在父表(即外键的来源表)中删除对应记录时,首先检查该记录

MySQL外键使用及说明(简单易懂)

MySQL外键使用及说明 一.外键约束 MySQL通过外键约束来保证表与表之间的数据的完整性和准确性. 外键的使用条件:  1.两个表必须是InnoDB表,MyISAM表暂时不支持外键(据说以后的版本有可能支持,但至少目前不支持): 2.外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显示建立:  3.外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列,比如int和tinyint可以,而int和char则不可以: 外键的好

Mysql 外键设置

MySql外键设置详解 (1) 外键的使用: 外键的作用,主要有两个:    一个是让数据库自己通过外键来保证数据的完整性和一致性    一个就是能够增加ER图的可读性    有些人认为外键的建立会给开发时操作数据库带来很大的麻烦.因为数据库有时候会由于没有通过外键的检测而使得开发人员删除,插入操作失败.他们觉得这样很麻烦其实这正式外键在强制你保证数据的完整性和一致性.这是好事儿.    例如:    有一个基础数据表,用来记录商品的所有信息.其他表都保存商品ID.查询时需要连表来查询商品的名称

mysql外键约束总结

总结三种MySQL外键约束方式 如果表A的主关键字是表B中的字段,则该字段称为表B的外键,表A称为主表,表B称为从表.外键是用来实现参照完整性的,不同的外键约束方式将可以使两张表紧密的结合起来,特别是修改或者删除的级联操作将使得日常的维护工作更加轻松.这里以MySQL为例,总结一下3种外键约束方式的区别和联系. 这里以用户表和用户组表为例,这是一个典型的多对一关系,多个用户对应于一个用户组. 首先创建用户组表: 创建用户组表 create table t_group ( id int not n

MySQL外键的作用

MySQL外键的作用: 保持数据一致性,完整性,主要目的是控制存储在外键表中的数据.使两张表形成关联,外键只能引用外表中列的值! 我们来建两个表 CREATE TABLE `example1` ( `stu_id` int(11) NOT NULL DEFAULT '0', `course_id` int(11) NOT NULL DEFAULT '0', `grade` float DEFAULT NULL, PRIMARY KEY (`stu_id`,`course_id`) ); CREA