在Create table语句Oracle中创建的一个或多个外键

时间:2017-12-07 02:51:50

标签: sql oracle

我有两个表,一个员工表和一个项目表。每个项目必须至少有一名员工,但它可能有更多。我正在努力弄清楚如何创建Project表,以便您可以拥有非固定数量的外键。我现在拥有的是:

CREATE TABLE EMPLOYEE (
EmployeeID number(10) NOT NULL,
FirstName varchar2(20),
LastName varchar2(20),
Address varchar2(20),
City varchar2(20),
State varchar2(2),
Zip number(5),
DoB varchar2(10),
PRIMARY KEY (EmployeeID)
);

INSERT INTO EMPLOYEE
Values ('1', 'Joe', 'Smith', '1 Main St', 'Stillwater', 'OK', 74075, '07/05/1992');

INSERT INTO EMPLOYEE
Values ('2', 'John', 'Johnson', '3 College Way', 'Stillwater', 'OK', 74074, '08/05/1992');

CREATE TABLE PROJECT (
    ProjectID number(10) NOT NULL,
    ProjectName varchar2(20),
    ProjectDesc varchar2(20),
    ProjectStartDate varchar2(20),
    EmployeeID number(10),
    PRIMARY KEY (ProjectID),
    CONSTRAINT FK_EmployeeID FOREIGN KEY (EmployeeID)
    REFERENCES EMPLOYEE(EmployeeID)
);

INSERT INTO Project
Values ('1', 'ProjectA', 'A Project', '12/05/2017', '1');

INSERT INTO Project
Values ('2', 'ProjectB', 'B Project', '01/05/2018', '1', '2');

显然,最后一行是出错的地方,因为有太多的信息。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

ProjectB与表格中的字段直接相关,您需要确保正确插入的CREATE TABLE EMPLOYEE ( EmployeeID number(10) NOT NULL as IDENTITY, ... PRIMARY KEY (EmployeeID) ); CREATE TABLE PROJECT ( ProjectID number(10) NOT NULL as IDENTITY, ... PRIMARY KEY (ProjectID) ); 数量与字段数相对应。

为了在相关表中插入多行,必须拆分插入。因此,您需要将两个员工插入分成INSERT INTO Project Values (null, 'ProjectB', 'B Project', '01/05/2018', '1'); INSERT INTO Project Values (null, 'ProjectB', 'B Project', '01/05/2018', '2'); ,并单独插入两个员工。

请注意,您还要确保两个主键自动递增,这样您就不必担心外键限制了!在Oracle中,您可以使用 IDENTITY 列执行此操作:

INSERT

然后你可以插入:

INSERT INTO Project Values (null, 'ProjectA', 'A Project', '12/05/2017', '1');
INSERT INTO Project Values (null, 'ProjectB', 'B Project', '01/05/2018', '1');
INSERT INTO Project Values (null, 'ProjectB', 'B Project', '01/05/2018', '2');

这总共给出了三个ProjectB语句:

    DECLARE
    i    NUMBER (1);
BEGIN
    FOR i IN 1 .. x
    LOOP
        INSERT INTO Project Values ('2', 'ProjectB', 'B Project', '01/05/2018', i);
    END LOOP;
END;

请注意,因为员工是您在A = [a1,a2,a3,...,an] B = [b1,b2,b3,...,bn] 的两个插入中唯一更改的内容,您可能需要考虑对这些插入进行循环:

a1 with b1
a2 with b2
...
an with bn

但是,在线下,我可以设想多个项目可以有多个员工,而员工可以从事多个项目。这将是多对多关系,这需要bridging table(也称为关联实体)。记住这一点可能是值得的:)

希望这有帮助!