【发布时间】:2017-07-18 05:38:44
【问题描述】:
所以我被要求解决的原始问题是:
创建两个表: 员工:empID (PK)、empFname、empLname、deptID(FK) 和 部门:deptID(PK)、deptName、chairID。 chairID 是 Employee 表中的 empID。 在 Department 表中插入至少 3 行,在 Employee 表中插入至少 6 行。 在执行以下业务规则的 chairID 更新时创建触发器: 一名员工最多可以主持一个部门。 每个部门只有一个椅子。
我的解决方案是这样的:
create table Employee(empID NUMBER,
empFname VARCHAR2(20),
empLname VARCHAR2(20),
deptID NUMBER,
PRIMARY KEY (empID)
);
create table Department(deptID NUMBER,
deptName VARCHAR2(20),
chairID NUMBER,
PRIMARY KEY (deptID));
ALTER TABLE Employee
ADD FOREIGN KEY (deptID) REFERENCES Department(deptID);
ALTER TABLE Department
ADD FOREIGN KEY (chairID) REFERENCES Employee(empID);
INSERT INTO DEPARTMENT (deptID ,deptName,chairID ) VALUES (401,'COMPUTER SCIENCE',301);
INSERT INTO DEPARTMENT (deptID ,deptName,chairID ) VALUES (402,'ELECTRONICS',302);
INSERT INTO DEPARTMENT (deptID ,deptName,chairID ) VALUES (403,'MATHEMATICS',303);
INSERT INTO EMPLOYEE (empID ,empFname ,empLname,deptID) VALUES (1001,'Alen','Zer',301);
INSERT INTO EMPLOYEE (empID ,empFname ,empLname,deptID) VALUES (1002,'Beny','Ker',301);
INSERT INTO EMPLOYEE (empID ,empFname ,empLname,deptID) VALUES (1003,'Clen','Ler',302);
INSERT INTO EMPLOYEE (empID ,empFname ,empLname,deptID) VALUES (1004,'Dlen','Mer',302);
INSERT INTO EMPLOYEE (empID ,empFname ,empLname,deptID) VALUES (1005,'Elen','Ner',303);
INSERT INTO EMPLOYEE (empID ,empFname ,empLname,deptID) VALUES (1006,'Flen','Oer',303);
CREATE OR REPLACE TRIGGER chairID_after_update
BEFORE UPDATE
ON Department
FOR EACH ROW
DECLARE
v_username varchar2(10);
v_count number;
v_sql varchar2(50);
BEGIN
select count(*) into v_count from Department where chairID = :new.chairID;
IF v_count = 0 then
v_sql := 'alter table set chairID ='+ :new.chairID;
execute immediate v_sql;
end if;
END;
/
我的表都创建并触发编译,但在尝试插入我的表时,我的所有插入语句都命中:
SQL 错误:ORA-02291:违反完整性约束 (SYSTEM.SYS_C0010675) - 未找到父键 02291. 00000 - “违反完整性约束 (%s.%s) - 未找到父键” *原因:外键值没有匹配的主键值。 *操作:删除外键或添加匹配的主键。
我应该怎么做才能解决这个问题?任何帮助/建议将不胜感激。
【问题讨论】:
-
除了合理且有趣的逻辑困难外,您的陈述中还有其他错误。查看 INSERT 中员工的部门编号,它们是 301、302、303……但 DEPARTMENTS 表中的部门编号是 401、402、403……这应该如何工作?反过来看,你的员工是 1001, 1002, .... 所以 CHAIRID 不能是 301, 302, 303 - 它应该是 EMPLOYEES 表中实际员工的 ID!
标签: database oracle oracle-sqldeveloper