一个表中有两个外键引用另一个表的一个主键可以吗?
EmployeeID 是员工表中的主键,在时间表表中作为外键出现两次。
很少有管理员用户代表其他员工填写时间表。
在 timsheet 表字段中,'TimsheetFor' 将具有从事项目工作的人员的员工 ID,而字段 'EnteredBy' 或 'FilledBy' 将具有已填写此时间表的人员的员工 ID。
以下哪个选项是正确的?
注意:表格仅显示与此问题相关的字段。
一个表中有两个外键引用另一个表的一个主键可以吗?
EmployeeID 是员工表中的主键,在时间表表中作为外键出现两次。
很少有管理员用户代表其他员工填写时间表。
在 timsheet 表字段中,'TimsheetFor' 将具有从事项目工作的人员的员工 ID,而字段 'EnteredBy' 或 'FilledBy' 将具有已填写此时间表的人员的员工 ID。
以下哪个选项是正确的?
注意:表格仅显示与此问题相关的字段。
我会选择选项 1。让两个外键列引用不同表中的相同主键列是完全可以的,因为每个外键值将引用相关表中的不同记录。
我确信选项 2TIMESHEET_TABLE
会起作用,但是您基本上会在and之间建立一对一的关系TIMESHEET_FILLED_BY
,从而使两个表变得不必要且更难维护。
事实上,如果需要ENTERED_BY
和TIMESHEET_FOR
成对使用,则使用选项 1更有意义,因为这是由数据库和外键自动强制执行的。
选项 1 是一个完美的解决方案。您可以定义外键约束如下
Timesheet_For 列的第一个外键约束
ALTER TABLE TIMESHEETTABLE
ADD CONSTRAINT fk_TimesheetTable_EmployeeTable
FOREIGN KEY (TIMESHEET_FOR)
REFERENCES EMPLOYEETABLE(EMPLOYEE_ID)
Entered_By 列的第二个外键约束
ALTER TABLE TIMESHEETTABLE
ADD CONSTRAINT fk_TimesheetTable_EmployeeTable_1
FOREIGN KEY (ENTERED_BY)
REFERENCES EMPLOYEETABLE(EMPLOYEE_ID)
是的,这没有问题...您可以将另一个表中一个表的主键用作外键两次。
您的查询如下:
SELECT t.EMPLOYEE_ID, a.NAME as TimeSheetFor, b.NAME as EnteredBy
FROM timesheet t
JOIN employee a ON t.timesheet_for =a.employee_id
JOIN employee b ON t.entered_by = b.employee_id
使用此查询,您将获得所需的结果。