【问题标题】:one foreign key and two primary keys一个外键和两个主键
【发布时间】:2012-09-21 00:02:22
【问题描述】:

我有一个分配表和一个员工表。我希望分配与现有员工和现有项目相关联。我有两个主键,一个来自员工表,另一个来自项目表。每个引用回分配表。我的外键约束是否可以像我展示的那样分开,或者它们必须在一起并且有一个“和”声明?

 create table assignment 
(asg_prj_p# number(2),
asg_emp_e#a varchar2(1),
asg_emp_e#n varchar2(5),
asg_hrs number(3),
constraint fk_project foreign key (asg_prj_p#) references project (prj_p#),
constraint fk_employee foreign key (asg_emp_e#a, asg_emp_e#n) references employee (emp_e#a, emp_e#n));

【问题讨论】:

  • :你的方向是对的,你所做的就是对的

标签: sql database oracle10g


【解决方案1】:

您的问题对我来说并不完全清楚。但是下面的语句将帮助您解决问题。

在您的分配表中,您有两个外键。一种是单外键:asg_prj_p#,另一种是复合外键(asg_emp_e#a,asg_emp_e#n)。复合外键必须引用复合主键或复合唯一键列。因此,在您的示例中,员工表的 (emp_e#a, emp_e#n) 列必须是复合主键或复合唯一键。

【讨论】:

    【解决方案2】:

    外键约束是独立的——即一个确保您在项目表中有一行具有在您的 asg_prog_p 字段中指定的 ID,另一个对员工表和构成它的键的两个字段执行相同的操作.因此,就外键约束而言,您所拥有的看起来不错。

    然后,您可能需要使用这 3 个字段的复合主键 - 这取决于员工是否可以在特定项目上拥有一项或多项分配。如果只有一个,那么复合主键可能是一个好主意。否则,您应该考虑是否需要另一个字段来加入复合主键,或者您可以创建一个新字段,例如“assignment_id”作为主键。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-29
      • 1970-01-01
      • 2010-09-17
      • 1970-01-01
      相关资源
      最近更新 更多