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视图中添加外键…
语法。