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

时间:2011-12-11 23:10:25

标签: mysql phpmyadmin

我有两张桌子:

第一个是这样的:

Person
       first_name (primary key)
       family_name (primary key)
       age
       [other things..]

第二个是:

Doctor
       first_name
       family_name
       specialty

所以基本上,在表Person中,他们不能是2具有相同first_namefamily_name的人。如果我使用phpmyadmin在primary key上设置它们,那么这很有效。

我的问题是,现在我想要添加一个不是Doctor的{​​{1}}。我已尝试在Persondoctor.first_name上设置外键约束,但它显然无法解决我的问题。

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

1 个答案:

答案 0 :(得分:1)

你的措辞不准确。一个表不能有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)
)  

这种外键约束,其中PRIMARY KEY表(Doctor)也是FOREIGN KEY到另一个表(Person)是常见的解决方案1::0..1关系(也称为超类型/子类型)。