1

我正在尝试填充我的数据库,但得到 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,
    name           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,
    student_email  VARCHAR2(45) 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 )
        REFERENCES faculty ( 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', '1', 'bob@mechanical.edu', 'active', 'bob', 'mechanical enginering');
INSERT INTO student (student_id, student_email, ethnicity, standing, name, gender, faculty_id, faculty_email) VALUES
    ('900123456', 'alice@student.edu', '50', 'good', 'alice', 'f', '1', 'bob@mechanical.edu');
INSERT INTO course (course_number, hours, title, section, department_name, faculty_id, faculty_email) VALUES
    ('543', '3', 'fluids', '01', 'mechanical enginering', '1', 'bob@mechanical.edu');
INSERT INTO location (building_number, room_number, department_name) VALUES
    ('12', '103', 'mechanical engineering');
INSERT INTO student_took_course (student_id, student_email, course_number, grade) VALUES
    ('900123456', 'alice@student.edu', '543', '3');

INSERT INTO department (name, major, minor, chair_id, chair_email) VALUES
    ('computer science', 'computer science major', '4', 'jerry@cs.edu');
INSERT INTO faculty (faculty_id, cs_id, faculty_email, status, name, department_name) VALUES
    ('4', '2', 'jerry@cs.edu', 'active', 'jerry', 'computer science');
INSERT INTO student (student_id, student_email, ethnicity, standing, name, gender, faculty_id, faculty_email) VALUES
    ('900987654', 'noah@student.edu', '23', 'good', 'noah', 'm', '4', 'jerry@cs.edu');
INSERT INTO student (student_id, student_email, ethnicity, standing, name, gender, faculty_id, faculty_email) VALUES
    ('900316487', 'bruce@student.edu', '23', 'probation', 'bruce', 'm', '4', 'jerry@cs.edu');
INSERT INTO course (course_number, hours, title, section, department_name, faculty_id, faculty_email) VALUES
    ('460', '4', 'golang', '01', 'computer science',  '4', 'jerry@cs.edu');
INSERT INTO location (building_number, room_number, department_name) VALUES
    ('43', '209', 'computer science');
INSERT INTO student_took_course VALUES
    ('900987654', 'noah@student.edu', '460', '4');

INSERT INTO department (name, major, minor, chair_id, chair_email) VALUES
    ('nuclear enginering', 'nuclear major', NULL, '3', 'james@nuckear.edu');
INSERT INTO faculty (faculty_id, cs_id, faculty_email, status, name, department_name) VALUES
    ('3', '7', 'james@nuclear.edu', 'active', 'james', 'nuclear enginering');
INSERT INTO student (student_id, student_email, ethnicity, standing, name, gender, faculty_id, faculty_email) VALUES
    ('900876543', 'alex@student.edu', '37', 'probation', 'alex', 'm', '3', 'james@nuclear.edu');
INSERT INTO course (course_number, hours, title, section, department_name, faculty_id, faculty_email) VALUES
    ('845', '2', 'reactors', '01', 'nuclear enginering', '3', 'james@nuclear.edu');
INSERT INTO location (building_number, room_number, department_name) VALUES
    ('65', '132', 'nuclear enginering');
INSERT INTO student_took_course VALUES
    ('900876543', 'alex@student.edu', '845', '2');

INSERT INTO department (name, major, minor, chair_id, chair_email) VALUES
    ('biology', 'biology major', NULL, '8', 'elizabeth@biology.edu');
INSERT INTO faculty (faculty_id, cs_id, faculty_email, status, name, department_name) VALUES
    ('8', '6', 'elizabeth@biology.edu', 'active', 'elizabeth', 'biology');
INSERT INTO faculty (faculty_id, cs_id, faculty_email, status, name, department_name) VALUES
    ('2', '9', 'dave@biology.edu', 'resigned', 'dave', 'biology');
INSERT INTO student (student_id, student_email, ethnicity, standing, name, gender, faculty_id, faculty_email) VALUES
    ('900452367', 'paul@student.edu', '05', 'good', 'paul', 'm', '8', 'elizabeth@biology.edu');
INSERT INTO course (course_number, hours, title, section, department_name, faculty_id, faculty_email) VALUES
    ('324', '3', 'micro biology', '01', 'biology', '8', 'elizabeth@biology.edu');
INSERT INTO course (course_number, hours, title, section, department_name, faculty_id, faculty_email) VALUES
    ('113', '3', 'intro to biology', '01', 'biology', '2', 'dave@biology.edu');
INSERT INTO location (building_number, room_number, department_name) VALUES
    ('04', '213', 'biology');
INSERT INTO student_took_course VALUES
    ('900452367', 'paul@student.edu', '324', '4');
INSERT INTO student_took_course VALUES
    ('900452367', 'paul@student.edu', '113', '2');
4

2 回答 2

0

查看模型(从您的 DDL 代码逆向工程)时,您似乎可以删除一些外键约束。有些列也可以(可能)被删除。

原始型号

在此处输入图像描述

修改后的模型 (需要更多的调整!) 在此处输入图像描述

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

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

于 2021-04-24T07:55:25.133 回答
0

您可以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;
于 2021-04-23T21:54:06.650 回答