#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, но нет менеджера с идентификатором 2003. «пытаюсь вставить сотрудник с менеджером кодом 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. Ошибка не связана с отношениями менеджера (что является еще одной проблемой), и, находясь в том же сеансе, если бы менеджер был вставлен, это не вызвало бы проблемы