我有2个表,User
和Employee
。每个用户都被赋予User_ID
,这是User
表中的主键和Employee
表中的外键。 Employee
表中的该属性也可以是主键吗?
答案 0 :(得分:22)
如果两个表之间存在一对一的关系,那么详细信息表的主键也是外键。
master detail (1 : 1)
+----------+ 1:1 +-------------+
| PK id |<---o| PK FK id |
+----------+ +-------------+
| col1 | | col1 |
| col2 | | col2 |
| etc. | | etc. |
+----------+ +-------------+
如果您具有m-to-n关系,则联结表具有与m和n表的两个主键相关的列。这些列同时是主键和外键。
m : n
m_table junction
+----------+ 1:m +------------+ n_table
| PK id1 |<---o| PK FK1 id1 | n:1 +----------+
+----------+ | PK FK2 id2 |o--->| PK id2 |
| col1 | +------------+ +----------+
| col2 | | | | col1 |
| etc. | +------------+ | etc. |
+----------+ +----------+
请注意,使用此结构时,一个表的记录只能链接到另一个表的特定记录一次,因为联结表的每个复合主键必须是唯一的。如果要允许非唯一配对,请在联结表中定义单独的主键:
m : n
junction
+---------+
m_table | PK id |
+----------+ 1:m +---------+ n_table
| PK id1 |<---o| FK1 id1 | n:1 +----------+
+----------+ | FK2 id2 |o--->| PK id2 |
| col1 | | | +----------+
| col2 | +---------+ | col1 |
| etc. | | etc. |
+----------+ +----------+
在这种情况下,主键和外键约束在不同的列上设置。或者,您也可以使用两个外键以及一个分子或另一个辨别属性来构建主键。
在您的情况下,如果User
和Employee
之间存在一对一或一对一或一对一的关系,那么是User_ID
在Employee
表中可以同时使用外键(FK)和主键(PK)。换句话说,这意味着:用户也可以是员工,在这种情况下,员工数据将附加到用户。如果他不是雇员(他可能是外部专家),则不附加员工记录。如果User_ID
是Employee
中的FK和PK,则每个用户最多只能附加一个员工记录。如果User_ID
只是FK而不是表Employee
中的PK,则用户可以拥有多个相关的员工记录。
答案 1 :(得分:2)
是。例如,如果您想强制所有员工都是用户,而某些用户可以是员工,那么您可以这样做。这将是(零或一)到一个关系。
否则,您通常不会将主键与外键相同,尽管它可能包含外键,就像多表关系的联结表一样。