我反复收到此“违反完整性约束 - 未找到父键”错误
Posted
技术标签:
【中文标题】我反复收到此“违反完整性约束 - 未找到父键”错误【英文标题】:I'm repeatedly getting this "integrity constraint violated- parent key not found" error 【发布时间】:2021-09-03 09:41:11 【问题描述】:问题是这样的:我有 2 个表 Employee 和 Department。两个表中都有 department_id 和 manager_id。我在表employee中有一个主键employee_id,在表department中有一个主键department_id。我必须将表员工外键的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('&DEPARTMENT_ID','&DEPARTMENT_NAME','&MANAGER_ID','&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('&DEPARTMENT_ID','&DEPARTMENT_NAME','&MANAGER_ID','&LOCATION_ID')
new 1: INSERT INTO DEPARTMENT VALUES('10','ADMINISTRATION','200','1700')
1 row created.
SQL> INSERT INTO EMPLOYEE VALUES('&EMPLOYEE_ID','&FIRST_NAME','&LAST_NAME','&EMAIL','&PHONE_NUMBER','&HIRE_DATE','&JOB_ID','&SALARY','&COMMISSION_PCT','&MANAGER_ID','&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('&EMPLOYEE_ID','&FIRST_NAME','&LAST_NAME','&EMAIL','&PHONE_NUMBER','&HIRE_DATE','&JOB_ID','&SALARY','&COMMISSION_PCT','&MANAGER_ID','&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
【问题讨论】:
为什么 Dept_ID 在第一个 Alter 命令中引用员工 ID 【参考方案1】:您的外键引用了错误的表FOREIGN KEY(DEPARTMENT_ID) REFERENCES EMPLOYEE(EMPLOYEE_ID);
应该
FOREIGN KEY(DEPARTMENT_ID) REFERENCES DEPARTMENT (DEPARTMENT_ID);
它正在尝试根据员工表中的 ID 验证部门 ID。
当您添加外键约束时,您所做的只是告诉数据库确保插入到列中的任何值都存在于相关表中(外键的另一端)。
所以ALTER TABLE ABC ADD CONSTRAINT TEST_FK FOREIGN KEY(MY_FK_COL) REFERENCES XYZ(MY_PK_COL);
告诉数据库,每次有人尝试插入或更新ABC
表中的MY_FK_COL
列时,数据库应检查该值是否已存在于@ 的MY_PK_COL
列中987654327@ 表。如果该值不存在,您会收到 ORA-02291: integrity constraint (TEST_FK) violated - parent key not found
错误,告诉您该值在父/相关表/外键的另一侧中不存在
这样做的主要原因是为了确保数据有效。以您的员工 -> 部门为例,您创建一个外键以确保只能将员工添加到实际存在的部门。
此外,您确实想使用正确的数据类型,因为您已将 ID 定义为数字,但随后将它们作为文本插入。它可能不会有什么不同,但这确实意味着数据库中需要进行一些转换,这可能会导致一些奇怪的事情。只需删除数字字段周围的单引号即可。
【讨论】:
ALTER TABLE EMPLOYEE 添加约束 DEP_FK 外键(DEPARTMENT_ID)参考部门(DEPARTMENT_ID);我改变了这个,我再次能够将值插入到部门表中,但是当我将值插入到员工表中时,再次得到了同样的错误。我还删除了数字数据类型的引号。我做错了什么? 我怀疑您第二次遇到的错误实际上与MAN_FK
??以上是尝试插入经理 ID 为 200 的员工,但没有 ID 为 200 的经理
"试图插入一个经理 ID 为 200 但没有 ID 为 200 的经理" 我首先在部门表中输入了以下值:'Enter value for department_id: 10 Enter department_name 的值:ADMINISTRATION 输入 manager_id 的值:200 输入 location_id 的值:1700' 之后,我尝试在员工表中输入值,其中 manager_id 为 200,department_id 为 10,但仍然得到同样的错误。
阅读以上内容,您在EMPLOYEE
表中的MANAGER_ID
列与DEPARTMENT
表中的MANAGER_ID
列无关。阅读我关于外键在做什么的笔记。您正在检查员工表的 EMPLOYEE_ID
列中是否存在 MANAGER_ID
值。你需要确定你的经理应该住在哪里。是部门经理还是员工经理?无论哪种方式,经理都应该作为员工记录存在,并带有引用它的外键
非常感谢您的解释。我使用了这个改变命令-“ALTER TABLE EMPLOYEE ADD CONSTRAINT MAN_FK FOREIGN KEY(MANAGER_ID) REFERENCES DEPARTMENT(MANAGER_ID);”并最终能够将值插入两个表中。我的作业今天到期,我现在可以按时提交了。【参考方案2】:
在插入经理之后尝试COMMIT
,然后再插入向他报告的员工。
【讨论】:
该错误与经理关系无关(这是另一个问题),如果插入经理,则在同一个会话中不会导致问题以上是关于我反复收到此“违反完整性约束 - 未找到父键”错误的主要内容,如果未能解决你的问题,请参考以下文章
将 socket.io 与 Mean 集成时反复出现 404 错误