繁体   English   中英

引用同一个主键的两个外键

[英]Two foreign keys referencing the same primary key

在一个表中有两个外键引用另一个表的一个主键是否可以?

EmployeeID 是雇员表中的主键,在时间表表中作为外键出现两次。

很少有管理员用户代表其他员工填写时间表。

在时间表表中,“TimsheetFor”字段将包含参与项目的人员的员工 ID,“EnteredBy”或“FilledBy”字段将包含填写此时间表的人员的员工 ID。

以下哪个选项是正确的?

注意:表格仅显示与此问题相关的字段。

在此处输入图片说明

我会选择选项 1 有两个外键列引用不同表中的相同主键列是完全没问题的,因为每个外键值将引用相关表中的不同记录。

我确信选项 2会起作用,但您基本上会在TIMESHEET_TABLETIMESHEET_FILLED_BY之间TIMESHEET_TABLE TIMESHEET_FILLED_BY关系,从而使两个表变得不必要且更难以维护。

事实上,如果ENTERED_BYTIMESHEET_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

使用此查询,您将获得所需的结果。

我有一个相同的问题,因为当我将更新规则设置为(级联)而不是(没有动作)来删除规则时,我收到一条错误消息实际上是在尝试在itemUnit2ID与表的第二个外键之间建立关系时发生的[项目]和来自表格[units]的对应主键[unitId]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM