我有两个表,一个员工表和一个项目表。每个项目必须至少有一名员工,但它可能有更多。我正在努力弄清楚如何创建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');
显然,最后一行是出错的地方,因为有太多的信息。我该如何解决这个问题?
答案 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(也称为关联实体)。记住这一点可能是值得的:)
希望这有帮助!