首页 > 解决方案 > 违反完整性约束是什么意思 - 在 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
);

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

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);

标签: sqlsqlplus

解决方案


问题陈述

完整性约束违规是指命令尝试对引用父项中不存在的记录的子项执行 aninsert或操作,或者,当命令尝试对父项执行 a或 an时,删除/更改由一个孩子。updatetabletabledeleteupdatetableprimary keytable

例子

在这些示例中,我将有一个名为的假想表PET和另一个名为的表OWNEROWNER被 引用PETOWNER_ID作为primary keyin theOWNER table和 the foreign keyin the PET table

示例 1

让我们假设有一个OWNERwithOWNER_ID为 1。让我们进一步假设没有PETwithOWNER_ID为 1。在这种情况下,您可以安全地update OWNER. OWNER_ID甚至是 1delete的记录OWNER_ID,假设没有进一步的参考OWNER

示例 2

让我们假设有一个OWNEROWNER_ID2。让我们进一步假设至少有一个PET记录OWNER_ID也是 2,引用这个特定的OWNER记录。您不能删除OWNERwho OWNER_IDis 2,因为这会导致违反完整性约束,因为它被PET. 因此,您要么先删除引用,要么将其PET更改为在执行后OWNER_ID引用实际值的内容。同样,出于同样的原因,您也不能是2。OWNERdeleteupdateOWNER_IDOWNEROWNER_ID

示例 3

让我们假设有一个OWNEROWNER_ID3 和一个PETOWNER_ID为 3。如果我们更新PET.OWNER_ID到 4,那么当且仅当存在OWNERwho OWNER_IDis 4 时它才会成功。否则它将违反完整性约束并失败。

示例 4

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

概括

由于您尝试对insertchild执行 an table,因此您的问题与示例 4 等效,即您尝试将insert记录写入 child table,将 parent 引用为 parent中table不存在的值。tableprimary 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;

insert将丢失的记录放入SERVICE第一个,或从脚本中删除孤儿插入。


推荐阅读