问题描述
我正在尝试填充我的数据库但得到 ORA-02291:无论我尝试插入数据的顺序如何,完整性约束错误。我应该在制作 fk 之前填充(尽管这对于数据库来说似乎是倒退的)?我收到每个 insert into 语句的错误。抱歉,我是 pl/sql 的新手。这是我的代码:
--
-- department Table
--
CREATE TABLE department (
name VARCHAR2(45) NOT NULL,major VARCHAR2(45) NOT NULL,minor VARCHAR2(45),chair_id NUMBER(10) NOT NULL,chair_email VARCHAR2(45) NOT NULL
);
ALTER TABLE department ADD CONSTRAINT departrment_pk PRIMARY KEY ( name );
--
-- faculty TABLE
--
CREATE TABLE faculty (
faculty_id NUMBER(10) NOT NULL,cs_id VARCHAR2(45) NOT NULL,faculty_email VARCHAR2(45) NOT NULL,status VARCHAR2(45) NOT NULL,name VARCHAR2(45) NOT NULL,department_name VARCHAR2(45) NOT NULL
);
ALTER TABLE faculty ADD CONSTRAINT faculty_pk PRIMARY KEY ( faculty_id,faculty_email );
--
-- student TABLE
--
CREATE TABLE student (
student_id NUMBER(10) NOT NULL,student_email VARCHAR2(45) NOT NULL,ethnicity NUMBER(10) NOT NULL,standing VARCHAR2(45) NOT NULL,gender VARCHAR2(45) NOT NULL,faculty_id NUMBER(10) NOT NULL,faculty_email VARCHAR2(45) NOT NULL
);
ALTER TABLE student ADD CONSTRAINT student_pk PRIMARY KEY ( student_id,student_email );
--
-- course TABLE
--
CREATE TABLE course (
course_number NUMBER(10) NOT NULL,hours NUMBER(10) NOT NULL,title VARCHAR2(45) NOT NULL,section NUMBER(10) NOT NULL,department_name VARCHAR2(45) NOT NULL,faculty_id NUMBER(10) NOT NULL,faculty_email VARCHAR2(45) NOT NULL
);
ALTER TABLE course ADD CONSTRAINT course_pk PRIMARY KEY ( course_number );
--
-- location TABLE
--
CREATE TABLE location (
building_number NUMBER(10) NOT NULL,room_number NUMBER(10) NOT NULL,department_name VARCHAR2(45) NOT NULL
);
--
-- student_took_course TABLE
--
CREATE TABLE student_took_course (
student_id NUMBER(10) NOT NULL,course_number NUMBER(10) NOT NULL,grade NUMBER(10)
);
--
-- create forgein keys
--
ALTER TABLE course
ADD CONSTRAINT course_department_fk FOREIGN KEY ( department_name )
REFERENCES department ( name )
ON DELETE CASCADE;
ALTER TABLE course
ADD CONSTRAINT course_faculty_fk FOREIGN KEY ( faculty_id,faculty_email )
REFERENCES faculty ( faculty_id,faculty_email )
ON DELETE CASCADE;
ALTER TABLE student_took_course
ADD CONSTRAINT course_number_fk FOREIGN KEY ( course_number )
REFERENCES course ( course_number )
ON DELETE CASCADE;
ALTER TABLE department
ADD CONSTRAINT department_faculty_fk FOREIGN KEY ( chair_id,chair_email )
REFERENCES faculty ( faculty_id,faculty_email );
ALTER TABLE faculty
ADD CONSTRAINT faculty_department_fk FOREIGN KEY ( department_name )
REFERENCES department ( name );
ALTER TABLE location
ADD CONSTRAINT location_department_fk FOREIGN KEY ( department_name )
REFERENCES department ( name );
ALTER TABLE student
ADD CONSTRAINT student_faculty_fk FOREIGN KEY ( faculty_id,faculty_email );
ALTER TABLE student_took_course
ADD CONSTRAINT student_id_fk FOREIGN KEY ( student_id,student_email )
REFERENCES student ( student_id,student_email )
ON DELETE CASCADE;
--
-- insert info
--
INSERT INTO department (name,major,minor,chair_id,chair_email) VALUES
('mechanical enginering','mechanical major','mechanical minor','1','bob@mechanical.edu');
INSERT INTO faculty (faculty_id,cs_id,faculty_email,status,name,department_name) VALUES
('1','bob@mechanical.edu','active','bob','mechanical enginering');
INSERT INTO student (student_id,student_email,ethnicity,standing,gender,faculty_id,faculty_email) VALUES
('900123456','alice@student.edu','50','good','alice','f','bob@mechanical.edu');
INSERT INTO course (course_number,hours,title,section,department_name,faculty_email) VALUES
('543','3','fluids','01','mechanical enginering','bob@mechanical.edu');
INSERT INTO location (building_number,room_number,department_name) VALUES
('12','103','mechanical engineering');
INSERT INTO student_took_course (student_id,course_number,grade) VALUES
('900123456','543','3');
INSERT INTO department (name,chair_email) VALUES
('computer science','computer science major','4','jerry@cs.edu');
INSERT INTO faculty (faculty_id,department_name) VALUES
('4','2','jerry@cs.edu','jerry','computer science');
INSERT INTO student (student_id,faculty_email) VALUES
('900987654','noah@student.edu','23','noah','m','jerry@cs.edu');
INSERT INTO student (student_id,faculty_email) VALUES
('900316487','bruce@student.edu','probation','bruce','jerry@cs.edu');
INSERT INTO course (course_number,faculty_email) VALUES
('460','golang','computer science','jerry@cs.edu');
INSERT INTO location (building_number,department_name) VALUES
('43','209','computer science');
INSERT INTO student_took_course VALUES
('900987654','460','4');
INSERT INTO department (name,chair_email) VALUES
('nuclear enginering','nuclear major',NULL,'james@nuckear.edu');
INSERT INTO faculty (faculty_id,department_name) VALUES
('3','7','james@nuclear.edu','james','nuclear enginering');
INSERT INTO student (student_id,faculty_email) VALUES
('900876543','alex@student.edu','37','alex','james@nuclear.edu');
INSERT INTO course (course_number,faculty_email) VALUES
('845','reactors','nuclear enginering','james@nuclear.edu');
INSERT INTO location (building_number,department_name) VALUES
('65','132','nuclear enginering');
INSERT INTO student_took_course VALUES
('900876543','845','2');
INSERT INTO department (name,chair_email) VALUES
('biology','biology major','8','elizabeth@biology.edu');
INSERT INTO faculty (faculty_id,department_name) VALUES
('8','6','elizabeth@biology.edu','elizabeth','biology');
INSERT INTO faculty (faculty_id,department_name) VALUES
('2','9','dave@biology.edu','resigned','dave','biology');
INSERT INTO student (student_id,faculty_email) VALUES
('900452367','paul@student.edu','05','paul','elizabeth@biology.edu');
INSERT INTO course (course_number,faculty_email) VALUES
('324','micro biology','biology',faculty_email) VALUES
('113','intro to biology','dave@biology.edu');
INSERT INTO location (building_number,department_name) VALUES
('04','213','biology');
INSERT INTO student_took_course VALUES
('900452367','324','4');
INSERT INTO student_took_course VALUES
('900452367','113','2');
解决方法
您可以在创建外键约束时使用 DEFERRABLE INITIALLY DEFERRED
选项,例如
ALTER TABLE department
ADD CONSTRAINT department_faculty_fk FOREIGN KEY ( chair_id,chair_email )
REFERENCES faculty ( faculty_id,faculty_email )
DEFERRABLE INITIALLY DEFERRED;
ALTER TABLE location
ADD CONSTRAINT location_department_fk FOREIGN KEY ( department_name )
REFERENCES department ( name )
DEFERRABLE INITIALLY DEFERRED;
为了在提交之前填充表期间不发生约束验证,并且在所有填充过程正常完成后,您可以使用ENABLE [VALIDATE]
启用这些约束选项如
ALTER TABLE department MODIFY CONSTRAINT department_faculty_fk ENABLE;
ALTER TABLE location MODIFY CONSTRAINT location_department_fk ENABLE;
,
查看模型时(从您的 DDL 代码逆向工程),您似乎可以删除一些外键约束。也可以(可能)删除某些列。
原始模型
一旦 DDL 代码编译/执行成功,首先开始填充“父表”(即关系“一侧”的表)。在本例中:DEPARTMENT,然后是 LOCATION 和 FACULTY,然后是 COURSE 和 STUDENT,然后是 STUDENT_TOOK_COURSE。如果您将每个表的 INSERT 编写为语句块 - 而不是像您最初所做的那样混合各种表的插入 - 应该更容易发现错误,并且还应该允许您成功运行所有 INSERT .
示例(使用您问题的所有 INSERT,并进行一些调整):参见 DBfiddle。