鱼C论坛

 找回密码
 立即注册
查看: 2083|回复: 3

mysql,三个表外键链接怎么,我怎么也只能设置成功2个

[复制链接]
发表于 2021-7-17 23:39:36 | 显示全部楼层 |阅读模式
60鱼币
本帖最后由 wow7jiao 于 2021-7-18 09:21 编辑

3个表的外键相互关联,2个表的好实现.3个标就不知道怎么实现,1对2,1对3表都通过不了,一直出错,下面是mysql原码,第一次学,细节不肯定,感觉不是很大的问题,但是一直搞定不了。


  1. /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
  2. /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
  3. /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
  4. CREATE DATABASE IF NOT EXISTS `af_school` /*!40100 DEFAULT CHARACTER SET utf8 */;

  5. USE `af_school`;

  6. /*Table structure for table `exam` */

  7. DROP TABLE IF EXISTS `exam`;

  8. CREATE TABLE `exam` (
  9.   `id` int(11) NOT NULL COMMENT '学号',
  10.   `chinese` int(11) DEFAULT NULL COMMENT '语文成绩',
  11.   `english` int(11) DEFAULT NULL COMMENT '英语成绩',
  12.   `math` int(11) DEFAULT NULL COMMENT '数学成线',
  13.   PRIMARY KEY (`id`)
  14. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

  15. /*Data for the table `exam` */

  16. insert  into `exam`(`id`,`chinese`,`english`,`math`) values (20180001,89,90,98),(20180002,78,82,93),(20180003,90,73,95),(20180004,88,98,83),(20180005,96,79,75),(20180006,77,98,82);

  17. /*Table structure for table `leave_event` */

  18. DROP TABLE IF EXISTS `leave_event`;

  19. CREATE TABLE `leave_event` (
  20.   `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '请假记录ID',
  21.   `stuId` int(11) NOT NULL COMMENT '学生ID',
  22.   `daysFrom` date DEFAULT NULL COMMENT '哪天开始',
  23.   `daysTo` date DEFAULT NULL COMMENT '哪天结束',
  24.   `type` tinyint(4) DEFAULT NULL COMMENT '类型,0病假,1事假',
  25.   `reason` varchar(256) DEFAULT NULL COMMENT '事由',
  26.   PRIMARY KEY (`id`)
  27. ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

  28. /*Data for the table `leave_event` */

  29. insert  into `leave_event`(`id`,`stuId`,`daysFrom`,`daysTo`,`type`,`reason`) values (1,20180001,'2018-01-02','2018-01-03',0,'感冒'),(2,20180001,'2018-03-06','2018-03-08',0,'发烧'),(3,20180003,'2018-03-01','2018-03-07',1,'出国旅游'),(4,20180005,'2018-03-07','2018-03-07',1,'家里有事'),(5,20180003,'2018-03-17','2018-03-18',0,'不舒服');

  30. /*Table structure for table `student` */

  31. DROP TABLE IF EXISTS `student`;

  32. CREATE TABLE `student` (
  33.   `id` int(11) NOT NULL COMMENT '学号',
  34.   `name` varchar(32) NOT NULL COMMENT '姓名',
  35.   `sex` tinyint(1) DEFAULT NULL COMMENT '性别',
  36.   `phone` varchar(16) DEFAULT '13800000000' COMMENT '手机号',
  37.   `birthday` date DEFAULT NULL COMMENT '生日',
  38.   PRIMARY KEY (`id`)
  39. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

  40. /*Data for the table `student` */

  41. insert  into `student`(`id`,`name`,`sex`,`phone`,`birthday`) values (20180001,'盖聂',1,'1409900089','1982-03-09'),(20180002,'卫庄',1,'1282399999','1993-10-01'),(20180003,'张良',1,NULL,'1996-03-11'),(20180004,'伏念',1,NULL,'1982-09-24'),(20180005,'颜路',1,'13699292899','1983-11-21'),(20180006,'赤练',0,'13819289890','1998-03-12'),(20180007,'端木蓉',0,'13800000000','1978-05-12'),(20180008,'盗跖',1,'13410012908','1993-09-10'),(20180009,'白凤',1,'13509890090','1994-04-20'),(20180010,'天明',1,'18799891829','2002-04-19'),(20180011,'月儿',0,'13882938990','2003-06-10');

  42. /*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
  43. /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
  44. /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
  45. /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
复制代码

QQ图片20210717233504.png
QQ图片20210717233532.png
QQ图片20210717233433.png
QQ图片20210718091845.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-7-21 10:33:42 | 显示全部楼层
可以参考django的ORM的设计, 使用一个单独的表专门存储关系 (叫做ContentType, 可以自行搜索)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-7-21 11:30:54 | 显示全部楼层
我觉得你是没搞清楚,外键的目的和写法,外键是指 这个列内的数值 参考自 另外一种表的主键列(的值)。
也就是,该外键列的数值 必须要先存在于 参考表的主键列之内——所以,你要保证 student表的id 列 先添加需要的学生ID。

从你报错的语句看,exam表 的ID列 若作为外键 为什么要 参考到 leave_event表 呢?
—— 参加考试的学生ID 不是都在student表的ID主键列内?为什么却参考leave_event表的?请了事假的学生的ID,又怎么可能参加了考试exam?

总而言之,考虑 创建 外键时,要考虑清楚,谁参考谁,为什么? 然后,所参考的表的那一列(或多列) 必须是 那个表的 主键列。
最后,一旦外键形成,该外键列就会受到所参考的主键列的"约束",又叫"外键约束"。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-7-5 13:14:14 | 显示全部楼层
阿奇_o 发表于 2021-7-21 11:30
我觉得你是没搞清楚,外键的目的和写法,外键是指 这个列内的数值 参考自 另外一种表的主键列(的值)。
...

我想设计一个3表相互关联的,那只是试验表,不考虑关系的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 08:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表