员工/历史 - 作为外键的复合键的一部分

时间:2015-03-26 18:19:37

标签: oracle foreign-keys constraints entities composite-primary-key

我有两个实体:

1)员工(家长)

CREATE TABLE EMPLOYEES (
employee_id       NUMBER   (3)    NOT NULL,
first_name        VARCHAR (20)    NOT NULL,
last_name         VARCHAR (20)    NOT NULL,
job_title         VARCHAR (20)    NOT NULL,
employee_type     VARCHAR  (1)    NOT NULL,
salary            NUMBER   (5),
hourly_pay        NUMBER (5,2),
bonus_pay         NUMBER (5,2),

CONSTRAINT employee_pk PRIMARY KEY(employee_id));

2)EMPLOYEE_HISTORY(儿童)

CREATE TABLE EMPLOYEE_HISTORY (
start_date        DATE            NOT NULL,
employee_id       NUMBER   (3)    NOT NULL,
end_date          DATE,
job_title         VARCHAR (10)    NOT NULL,
hourly_rate       NUMBER (5,2)    NOT NULL,

CONSTRAINT employee_history_pk PRIMARY KEY(start_date, employee_id));

我试图创建:

ALTER TABLE employee_history
  ADD CONSTRAINT employee_history_fk 
    FOREIGN KEY (employee_id)
      REFERENCES employee_history(employee_id);

当我这样做时,我收到错误

ORA-02270: no matching unique or primary key for this column-list

我的猜测是我无法在employee_id上创建约束,因为我的子表中有一个复合键。我理解当员工被放入数据库时​​,父表被填写并且"开始日期"应该和其他一切一起填写。但是,如果我在父表中也有start_date,我不明白这是如何工作的。我可以创建我的约束,是的,但是如果在员工输入数据库时​​输入了start_date,我将如何能够记录start_date中的更改。

我考虑过使用job_title作为主键而不是start_date,因为它存在于两个表中,但是当员工再次升级和降级时会发生什么?当插入相同的employee_id和job_title时,是否会出现重复值约束?

1 个答案:

答案 0 :(得分:0)

您的references子句需要引用父表。不是子表

ALTER TABLE employee_history
  ADD CONSTRAINT employee_history_fk 
    FOREIGN KEY (employee_id)
      REFERENCES employee(employee_id); -- employee not employee_history

您发布的SQL正在尝试创建自引用外键,其中employee_history是父项和子项。在这种情况下,这没有意义。