ORA-02291: ограничение целостности со всеми таблицами, имеющими внешний ключ

Я пытаюсь заполнить свою базу данных, но получаю ORA-02291: ошибка ограничения целостности независимо от того, в каком порядке я пытаюсь вставить данные. Должен ли я заполнить перед выполнением fk(хотя для базы данных это кажется обратным)? Я получаю сообщение об ошибке для каждой вставки в инструкцию. Извините, я новичок в 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');

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. .

Пример (с использованием всех вставок ваших вопросов с небольшими изменениями): см. DBfiddle .

Другие вопросы по тегам