如何设置依赖于其他两个表的关系的外键?

时间:2014-07-14 14:25:21

标签: mysql phpmyadmin foreign-keys relational-database foreign-key-relationship

我有3张桌子;教师表,科目表和事件表。 1.学科与教师之间存在一对多的关系,即每个教师只能教授一门学科,但很多教师可以教授同一科目。 2.教师和事件之间有很多关系。

主题表的示例

id(PK)      |  name
-------------------
1           |  php
-------------------
2           |  java
-------------------
3           |  python
-------------------
4           |  c++
--------------------
5           |  c#

教师表示例

id(PK)      |  name      | subject_id(FK to subjects.id) 
----------------------------------
1           |  messi     |  2
----------------------------------
2           |  ronaldo   |  4
----------------------------------
3           |  pele      |  1
----------------------------------
4           |  maradona  |  2

事件表的示例

id(PK)      |  venue      | subject_id (FK to teacher.id)     | teacher_id(FK to subject.id)
-----------------------------------------------------------------------------------------------
1           |  location1  |       2                           |      has to be either 1 or 4
-----------------------------------------------------------------------------------------------
2           |  location2  |       1                           |      has to be 3 only
------------------------------------------------------------------------------------------------
3           |  location3  |       4                           |      has to be 2 only
------------------------------------------------------------------------------------------------
4           |  location4  |       4                           |      has to be 2 only

如何在foreign key字段中获得teacher_id下拉菜单,其中包含基于subject_id中指定值的可用选项?如果在go的数据插入部分中点击phpmyadmin后至少无法收到错误消息?

1 个答案:

答案 0 :(得分:1)

我不使用phpmyadmin,但我会从

开始
  • 对subjects.name,
  • 的唯一约束
  • 对{teachers.name,teachers.subject_id},
  • 的唯一约束
  • {events.venue,events.subject_id,events.teacher_id}的唯一约束,
  • 对{teacher.id,teachers.subject_id}的唯一约束。

前三个与身份有关;最后一个允许您使用外键约束来定位{teachers.id,teachers.subject_id}。

在一般情况下,人们的名字并不是唯一的。所以你可以有两位教同一主题的同名教师。如何处理这类问题取决于应用程序。

然后是外键

  • 从teachers.subject_id到subjects.id,和
  • 从{events.teacher_id,events.subject_id}到{teachers.id,teachers.subject_id}

如果您尝试将具有错误主题的教师插入事件,那么至少会给您一个错误。

您需要use the INNODB engine来强制执行外键约束。其他引擎会解析它们,但忽略它们。

  

InnoDB支持FOREIGN KEY和REFERENCES子句   存储引擎,它实现ADD [CONSTRAINT [symbol]] FOREIGN KEY   [index_name](...)REFERENCES ...(...)。请参见第14.6.6节“InnoDB   和外键约束“。对于其他存储引擎,条款   被解析但被忽略。