Mysql 具有复合主键的表上的外键约束

Mysql 具有复合主键的表上的外键约束,mysql,phpmyadmin,Mysql,Phpmyadmin,我有两张桌子: 第一个是这样的: Person first_name (primary key) family_name (primary key) age [other things..] 第二个是: Doctor first_name family_name specialty 因此,基本上,在表Person中,他们不能是两个同名的人。如果我使用phpmyadmin将它们都设置为主键,则效果

我有两张桌子:

第一个是这样的:

Person
       first_name (primary key)
       family_name (primary key)
       age
       [other things..]
第二个是:

Doctor
       first_name
       family_name
       specialty
因此,基本上,在表Person中,他们不能是两个同名的人。如果我使用phpmyadmin将它们都设置为
主键
,则效果很好

我的问题是,现在我想让它不可能添加一个不是
人的
医生
。我已尝试对
doctor.first\u name
doctor.family\u name
设置外键约束,但显然无法解决我的问题


(不要要求我使用id或其他东西,我的表比这复杂得多,我不能使用id,它必须是一个具有复合主键的表)。

您的措辞不准确。一个表不能有2个主键。但是,它可以有一个由2个或更多列组成的复合键(复合)主键

CREATE TABLE Person
(      first_name 
,      family_name 
,      age
,      ...
,   PRIMARY KEY (first_name, family_name)
)
撇开关于代理键和自然键的讨论不谈,当您有这样一个复合主键时,另一个表中的任何外键都应该是复合键,并引用您的复合主键:

CREATE TABLE Doctor
(      first_name
,      family_name
,      specialty
,      ...
,   PRIMARY KEY (first_name, family_name)

,   FOREIGN KEY (first_name, family_name)
      REFERENCES Person (first_name, family_name)
)  

这种外键约束是
1::0..1
关系(也称为超类型/子类型)的常见解决方案,其中一个表(
Doctor
)的
主键也是另一个表(
Person
)的
外键,每个明智的程序员都会要求您使用ID。如果您在每个表中都使用ID,那么这个问题(以及更多问题)将非常容易解决。。。当有人改名时,你会怎么做?当两个人同名时?这不是添加代理密钥的真正原因。真正的原因是主键可能被其他表引用(作为外键)。然后改名会变得很麻烦。这是学校项目的一部分,我不能做我想做的一切。如果你不必使用和识别并坚持第一个名字/姓氏,你会怎么做?我的意思是,如果一个医生叫“约翰·史密斯”,那么他也必须是一个叫“约翰·史密斯”的人。是的,我读得更仔细,而且很清楚。谢谢,这确实有帮助,但是您知道如何使用phpmyadmin设置复合外键吗?我认为phpmyadmin中有一个关系视图(内部结构视图)。您可以始终使用
ALTER TABLE。。。在SQL视图中添加外键…
语法。