Oracle表与自身有1-M关系

时间:2017-02-22 20:14:45

标签: sql oracle database-design foreign-keys ddl

假设我有一张Staff

的表格
create table staff (
    staffID number,
    staffName varchar2(255)
);

但是每个工作人员都有零个或多个下属,他们也是工作人员。

如何设计表格?

我正在考虑添加一个引用staff

上另一行的额外列
alter table staff add (subordinateID number not null);

为了使它成为外键我还必须使subordinateID成为主键

alter table staff add constraint pk primary key (staffID, subordinateID);

当我实际引用时,即将subordinateID链接到下属的staffID

alter table staff add constraint fk foreign key (subordinateID) references staff (staffID);

出现错误

  

ORA-02270:此列列表没有匹配的唯一键或主键

这让我感到困惑,因为我已经将staffID作为主键的一部分了?我该怎么做才能解决这个问题,我应该如何设计表格呢?

3 个答案:

答案 0 :(得分:2)

由于工作人员可以有多个下属,保留subordinate_id列可能是一个坏主意 - 它违反了1NF。相反,我建议从另一个方向看,并且每个工作人员保留他的经理的身份,这是独一无二的:

CREATE TABLE staff (
    staffID NUMBER NOT NULL,
    staffName VARCHAR2(255),
    managerId NUMBER
);

ALTER TABLE staff ADD CONSTRAINT staff_pk PRIMARY KEY (staffID);

ALTER TABLE staff ADD CONSTRAINT staff_fk
FOREIGN KEY (managerID) REFERENCES staff (staffID);

答案 1 :(得分:1)

这不起作用,因为会有多个下属,你想要的是一个包含subordinateId和managerid的联结表,然后你就可以构建层次结构,你想要看到整个链。

答案 2 :(得分:0)

试试这个:

create table staff (
    staffID number primary key,
    staffName varchar2(255),
    bossID number
);

alter table staff add constraint fk_staff_boss
    foreign key (bossID) references staff(staffID);