这是我的代码 有人可以看看吗?谢谢!
//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
中不存在的记录执行insert
或update
的事件,或者当命令尝试对父table
执行delete
或update
时,删除/更改子table
引用的primary key
。
例子
在这些例子中,我将有一个名为PET
的虚构表和另一个名为OWNER
的虚表,OWNER
被PET
引用,OWNER_ID
是OWNER
table
中的primary key
和PET
table
中的foreign key
。
例 1
假设有一个OWNER
,OWNER_ID
为 1。让我们进一步假设,OWNER_ID
是 1 没有PET
。在这种情况下,您可以安全地update
OWNER
.OWNER_ID
甚至delete
OWNER_ID
为 1 的记录,假设没有关于OWNER
的进一步引用。
例 2
假设有一个OWNER
,OWNER_ID
为 2。让我们进一步假设至少有一个PET
记录,其OWNER_ID
也是 2,引用这个特定的OWNER
记录。您无法删除OWNER_ID
为 2 的OWNER
,因为这会导致完整性约束冲突,因为它被PET
引用。因此,您可以先删除引用PET
,或者将其OWNER_ID
更改为在执行delete
后引用实际OWNER
的内容。同样,出于同样的原因,您无法update
OWNER_ID
为 2 的OWNER
的OWNER_ID
。
例 3
假设有一个OWNER
,OWNER_ID
是 3,PET
的OWNER_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;
或者先将缺少的记录insert
到SERVICE
中,或者从脚本中删除孤立插入。