违反完整性约束是什么意思 - 在 SQLplus 中找不到父键



这是我的代码 有人可以看看吗?谢谢!

//table
CREATE TABLE LINE (
REQ_NUM NUMBER (38,0) NOT NULL,
LIN_NUM NUMBER (38,0),
LIN_HOURS NUMBER (4,2) NOT NULL,
LINE_PRICE NUMBER (6,2) NOT NULL,
SVC_NUM NUMBER(38,0) NOT NULL,
PRIMARY KEY(REQ_NUM,LIN_NUM),
FOREIGN KEY (SVC_NUM) REFERENCES SERVICE
);

可以插入底部的三个数据,但不能插入它们//数据

INSERT INTO LINE VALUES (500, 1, 35, 0.5, 45);
INSERT INTO LINE VALUES(500,2,20,1.5, 150);
INSERT INTO LINE VALUES(600, 1, 35, 0.5, 50);
INSERT INTO LINE VALUES(700, 1, 15, 10, 750);
INSERT INTO LINE VALUES(800, 1, 30, 48, 7000);
INSERT INTO LINE VALUES(900, 1, 25, 6, 450);
INSERT INTO LINE VALUES(1000, 1, 20, 1.5, 125);
INSERT INTO LINE VALUES(1100,1, 35, 0.5, 45);
INSERT INTO LINE VALUES(1100, 3, 20, 2 ,150);
INSERT INTO LINE VALUES(1200, 1, 30, 8, 250);
INSERT INTO LINE VALUES(1300, 1, 35, 0.75, 50);
INSERT INTO LINE VALUES(600, 2, 40, 0.5, 25);
INSERT INTO LINE VALUES(1100, 2, 40, 0.5, 25);
INSERT INTO LINE VALUES(1400, 1, 40, 1, 25);

问题陈述

完整性约束冲突是指命令尝试对子table引用父table中不存在的记录执行insertupdate的事件,或者当命令尝试对父table执行deleteupdate时,删除/更改子table引用的primary key

例子

在这些例子中,我将有一个名为PET的虚构表和另一个名为OWNER的虚表,OWNERPET引用,OWNER_IDOWNERtable中的primary keyPETtable中的foreign key

例 1

假设有一个OWNEROWNER_ID为 1。让我们进一步假设,OWNER_ID是 1 没有PET。在这种情况下,您可以安全地updateOWNER.OWNER_ID甚至deleteOWNER_ID为 1 的记录,假设没有关于OWNER的进一步引用。

例 2

假设有一个OWNEROWNER_ID为 2。让我们进一步假设至少有一个PET记录,其OWNER_ID也是 2,引用这个特定的OWNER记录。您无法删除OWNER_ID为 2 的OWNER,因为这会导致完整性约束冲突,因为它被PET引用。因此,您可以先删除引用PET,或者将其OWNER_ID更改为在执行delete后引用实际OWNER的内容。同样,出于同样的原因,您无法updateOWNER_ID为 2 的OWNEROWNER_ID

例 3

假设有一个OWNEROWNER_ID是 3,PETOWNER_ID也是 3。如果我们将PET.OWNER_ID更新为 4,那么当且仅当存在OWNER_ID为 4 的OWNER时,它将成功。否则,它将违反完整性约束并失败。

例 4

假设我们尝试插入一个OWNER_ID为 5 的PET。当且仅当存在OWNER_ID为 5 的OWNER时,它将成功。否则,它将由于违反完整性约束而失败。

总结

由于您尝试对子table执行insert,因此您的问题等效于示例 4,即您尝试将记录insert到子table中,使用父table中不存在的值引用父table作为primary key

因此,您要么需要删除尝试创建孤立记录的插入,要么执行insert-select,例如

INSERT INTO LINE(REQ_NUM, LIN_NUM, LIN_HOURS, LINE_PRICE, SVC_NUM)
SELECT 1300, 1, 35, 0.75, SERVICE.SVC_NUM
FROM SERVICE
WHERE SERVICE.SVC_NUM = 50;

或者先将缺少的记录insertSERVICE中,或者从脚本中删除孤立插入。

最新更新