Ric*_*rdG 6 database foreign-keys primary-key relational-database
我有2张桌子,User
和Employee
.每个用户都被赋予一个User_ID
,这是User
表中的主键和表中的外键Employee
.Employee
表中的该属性也可以是主键吗?
Oli*_*bes 23
如果两个表之间具有一对一的关系,则详细信息表的主键也是外键.
master detail (1 : 1)
+----------+ 1:1 +-------------+
| PK id |<---o| PK FK id |
+----------+ +-------------+
| col1 | | col1 |
| col2 | | col2 |
| etc. | | etc. |
+----------+ +-------------+
Run Code Online (Sandbox Code Playgroud)
如果您具有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. |
+----------+ +----------+
Run Code Online (Sandbox Code Playgroud)
请注意,使用此构造时,一个表的记录只能链接到另一个表的特定记录一次,因为联结表的每个复合主键必须是唯一的.如果要允许非唯一配对,请在联结表中定义单独的主键:
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. |
+----------+ +----------+
Run Code Online (Sandbox Code Playgroud)
在这种情况下,主键和外键约束设置在不同的列上.或者,您也可以使用两个外键以及一个分子或另一个辨别属性构建主键.
在你的情况,如果有一个一对一或一对零或一的关系User
和Employee
,然后是的,User_ID
在Employee
表可以是外键(FK)和主键(PK)的同时.换言之,这意味着:用户也可以是员工,在这种情况下,员工数据将附加到用户.如果他不是雇员(他可能是外部专家),则不附加员工记录.如果User_ID
是FK和PK Employee
,则每个用户最多可以附加一个员工记录.如果表User_ID
中只有FK而不是PK,Employee
则用户可以拥有多个相关的员工记录.