Я неоднократно получаю эту ошибку «нарушено ограничение целостности — родительский ключ не найден» .

#sql #oracle

Вопрос:

Проблема заключается в следующем: у меня есть 2 таблицы Сотрудника и отдела. В обеих таблицах есть department_id и manager_id. У меня есть идентификатор первичного ключа employee_id в таблице employee и идентификатор первичного ключа department_id в таблице department. Я должен сделать department_id и manager_id внешних ключей сотрудника таблицы для department_table. Теперь я потратил более 15 часов (я знаю, в это трудно поверить), пытаясь сделать это, но потерпел неудачу. После создания внешних ключей я могу вставлять значения в таблицу отдела, а затем, когда я пытаюсь ввести значения в таблицу сотрудников, я получаю ошибку «недопустимое ограничение нарушено». Я знаю, что это может быть очень простой вещью, но я действительно новичок в этом, и эти вещи с внешним ключом все еще сбивают меня с толку. Может ли кто-нибудь сказать мне, что не так с моим кодом, почему я могу вставлять значения только в таблицу отдела, а не в таблицу сотрудников.

Вот содержимое моего катушечного файла:

 CREATE TABLE EMPLOYEE(EMPLOYEE_ID NUMBER(6) CONSTRAINT EMP_NNPK PRIMARY KEY NOT NULL, FIRST_NAME VARCHAR2(20) CONSTRAINT FIRSTNAME_NN NOT NULL, LAST_NAME VARCHAR2(20) CONSTRAINT LASTNAME_NN NOT NULL, EMAIL VARCHAR2(25) CONSTRAINT EMAIL_UKNN UNIQUE NOT NULL, PHONE_NUMBER VARCHAR2(20) DEFAULT '0000000000', HIRE_DATE DATE CONSTRAINT HIREDATE_NN NOT NULL, JOB_ID VARCHAR2(10) CONSTRAINT JOBID_NN NOT NULL, SALARY NUMBER(8,2) CONSTRAINT SALARY_CHECK CHECK(SALARY >5000), COMMISSION_PCT NUMBER(2,2), MANAGER_ID NUMBER(6), DEPARTMENT_ID NUMBER(4) CONSTRAINT DEPTID_NN NOT NULL);

Table created.

SQL> CREATE TABLE DEPARTMENT(DEPARTMENT_ID NUMBER(4) CONSTRAINT DEPT_NN_PK PRIMARY KEY NOT NULL, DEPARTMENT_NAME VARCHAR2(30) CONSTRAINT DEPTNAME_NN NOT NULL, MANAGER_ID NUMBER(6) CONSTRAINT MANAGERID_UK UNIQUE, LOCATION_ID NUMBER(4));

Table created.

SQL> ALTER TABLE EMPLOYEE ADD CONSTRAINT DEP_FK FOREIGN KEY(DEPARTMENT_ID) REFERENCES EMPLOYEE(EMPLOYEE_ID);

Table altered.

SQL> ALTER TABLE EMPLOYEE ADD CONSTRAINT MAN_FK FOREIGN KEY(MANAGER_ID) REFERENCES EMPLOYEE(EMPLOYEE_ID);

Table altered.

SQL> INSERT INTO DEPARTMENT VALUES('amp;DEPARTMENT_ID','amp;DEPARTMENT_NAME','amp;MANAGER_ID','amp;LOCATION_ID');
Enter value for department_id: 10
Enter value for department_name: ADMINISTRATION
Enter value for manager_id: 200
Enter value for location_id: 1700
old   1: INSERT INTO DEPARTMENT VALUES('amp;DEPARTMENT_ID','amp;DEPARTMENT_NAME','amp;MANAGER_ID','amp;LOCATION_ID')
new   1: INSERT INTO DEPARTMENT VALUES('10','ADMINISTRATION','200','1700')

1 row created.

SQL> INSERT INTO EMPLOYEE VALUES('amp;EMPLOYEE_ID','amp;FIRST_NAME','amp;LAST_NAME','amp;EMAIL','amp;PHONE_NUMBER','amp;HIRE_DATE','amp;JOB_ID','amp;SALARY','amp;COMMISSION_PCT','amp;MANAGER_ID','amp;DEPARTMENT_ID');
Enter value for employee_id: 174369
Enter value for first_name: OLIVIA
Enter value for last_name: MATOS
Enter value for email: OLIVIA@GMAIL.COM
Enter value for phone_number: 8989166387
Enter value for hire_date: 03-SEP-2021
Enter value for job_id: 20ABC101
Enter value for salary: 100000.00
Enter value for commission_pct: 0.10
Enter value for manager_id: 200
Enter value for department_id: 10
old   1: INSERT INTO EMPLOYEE VALUES('amp;EMPLOYEE_ID','amp;FIRST_NAME','amp;LAST_NAME','amp;EMAIL','amp;PHONE_NUMBER','amp;HIRE_DATE','amp;JOB_ID','amp;SALARY','amp;COMMISSION_PCT','amp;MANAGER_ID','amp;DEPARTMENT_ID')
new   1: INSERT INTO EMPLOYEE VALUES('174369','OLIVIA','MATOS','OLIVIA@GMAIL.COM','8989166387','03-SEP-2021','20ABC101','100000.00','0.10','200','10')
INSERT INTO EMPLOYEE VALUES('174369','OLIVIA','MATOS','OLIVIA@GMAIL.COM','8989166387','03-SEP-2021','20ABC101','100000.00','0.10','200','10')
*
ERROR at line 1:
ORA-02291: integrity constraint (SYSTEM.DEP_FK) violated - parent key not found
 

Комментарии:

1. Почему Dept_ID ссылается на идентификатор сотрудника в 1-й команде Alter

Ответ №1:

Ваш внешний ключ ссылается на неправильную таблицу FOREIGN KEY(DEPARTMENT_ID) REFERENCES EMPLOYEE(EMPLOYEE_ID); , если FOREIGN KEY(DEPARTMENT_ID) REFERENCES DEPARTMENT (DEPARTMENT_ID); он пытается проверить идентификатор отдела по идентификатору в таблице сотрудников.


Когда вы добавляете ограничение внешнего ключа, все, что вы делаете, — это сообщаете базе данных, чтобы убедиться, что любое значение, вставляемое в столбец, существует в соответствующей таблице (другая сторона внешнего ключа).

таким ALTER TABLE ABC ADD CONSTRAINT TEST_FK FOREIGN KEY(MY_FK_COL) REFERENCES XYZ(MY_PK_COL); образом, база данных сообщает, что каждый раз, когда кто-то пытается вставить или обновить MY_FK_COL столбец в ABC таблице, база данных должна проверять, что значение уже существует в MY_PK_COL столбце XYZ таблицы. Если значение не существует, вы получите ORA-02291: integrity constraint (TEST_FK) violated - parent key not found сообщение об ошибке, сообщающее, что значение еще не существует в родительской / связанной таблице / на другой стороне внешнего ключа

Основная причина этого заключается в обеспечении правильности данных. Возьмем пример вашего сотрудника -> отдел, вы создаете внешний ключ, чтобы гарантировать, что сотрудники могут быть добавлены только в те отделы, которые действительно существуют.


Кроме того, вы действительно хотите использовать правильные типы данных, поскольку вы определили свои идентификаторы как номер, но затем вставляете их в виде текста. Это, вероятно, ничего не изменит, но это означает, что в базе данных должна происходить какая-то конверсия, и это может вызвать некоторые странности. Просто удалите одинарные кавычки вокруг числовых полей.

Комментарии:

1. ИЗМЕНИТЬ ТАБЛИЦУ СОТРУДНИК ДОБАВИТЬ ОГРАНИЧЕНИЕ DEP_FK ВНЕШНИЙ КЛЮЧ(DEPARTMENT_ID) ССЫЛАЕТСЯ на ОТДЕЛ (DEPARTMENT_ID); Я изменил это, я снова смог вставить значения в таблицу отдела, но когда я пошел, чтобы вставить значения в таблицу сотрудников, снова получил ту же ошибку. Также я удалил кавычки для числовых типов данных. Что я делаю не так?

2. Я подозреваю, что ошибка, которую вы получили во второй раз, на самом деле была связана с MAN_FK ?? Вышесказанное пытается вставить сотрудника с идентификатором менеджера 200, но нет менеджера с идентификатором 200

3. «пытаюсь вставить сотрудник с менеджером кодом 200, но есть не является руководителем с кодом 200» я впервые введены следующие значения в отделе таблица: ‘введите значение для department_id: 10 введите значение для department_name: управления введите значения для manager_id: 200 ввести значение для чего ты больше: 1700′ после этого я попытался ввести значения в таблицу employee, в которой я поставил manager_id как 200 и department_id как 10 и по-прежнему получил ту же ошибку.

4. Прочтите вышесказанное, ваш MANAGER_ID столбец в EMPLOYEE таблице не имеет ничего общего со MANAGER_ID столбцом в DEPARTMENT таблице. Прочтите мои заметки о том, что делает внешний ключ. Вы проверяете MANAGER_ID , существуют ли значения в EMPLOYEE_ID столбце таблицы сотрудник. Вам нужно решить, где должен жить ваш менеджер. Это менеджер отдела или менеджер сотрудника? В любом случае менеджер должен существовать как запись сотрудника с внешним ключом, ссылающимся на нее

5. Большое вам спасибо за объяснение. Я использовал эту команду alter-«ИЗМЕНИТЬ СОТРУДНИКА ТАБЛИЦЫ, ДОБАВИТЬ ОГРАНИЧЕНИЕ MAN_FK ВНЕШНИЙ КЛЮЧ(ИДЕНТИФИКАТОР МЕНЕДЖЕРА), ОТДЕЛ ССЫЛОК(ИДЕНТИФИКАТОР МЕНЕДЖЕРА)»; и, наконец, смог вставить значения в обе таблицы. Мое задание должно быть выполнено сегодня, теперь я смогу отправить его вовремя.

Ответ №2:

Попробуйте COMMIT после вставки менеджера, прежде чем вставлять сотрудника, отчитывающегося перед ним .

Комментарии:

1. Ошибка не связана с отношениями менеджера (что является еще одной проблемой), и, находясь в том же сеансе, если бы менеджер был вставлен, это не вызвало бы проблемы