微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ORA-02291: 所有表都具有外键的完整性约束

如何解决ORA-02291: 所有表都具有外键的完整性约束

我正在尝试填充我的数据库但得到 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 代码逆向工程),您似乎可以删除一些外键约束。也可以(可能)删除某些列。

原始模型

enter image description here

修改后的模型 (需要更多的调整!) enter image description here

一旦 DDL 代码编译/执行成功,首先开始填充“父表”(即关系“一侧”的表)。在本例中:DEPARTMENT,然后是 LOCATION 和 FACULTY,然后是 COURSE 和 STUDENT,然后是 STUDENT_TOOK_COURSE。如果您将每个表的 INSERT 编写为语句块 - 而不是像您最初所做的那样混合各种表的插入 - 应该更容易发现错误,并且还应该允许您成功运行所有 INSERT .

示例(使用您问题的所有 INSERT,并进行一些调整):参见 DBfiddle

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。