sql - 违反完整性约束是什么意思 - 在 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);
解决方案
问题陈述
完整性约束违规是指命令尝试对引用父项中不存在的记录的子项执行 aninsert
或操作,或者,当命令尝试对父项执行 a或 an时,删除/更改由一个孩子。update
table
table
delete
update
table
primary key
table
例子
在这些示例中,我将有一个名为的假想表PET
和另一个名为的表OWNER
,OWNER
被 引用PET
,OWNER_ID
作为primary key
in theOWNER
table
和 the foreign key
in the PET
table
。
示例 1
让我们假设有一个OWNER
withOWNER_ID
为 1。让我们进一步假设没有PET
withOWNER_ID
为 1。在这种情况下,您可以安全地update
OWNER
. OWNER_ID
甚至是 1delete
的记录OWNER_ID
,假设没有进一步的参考OWNER
。
示例 2
让我们假设有一个OWNER
为OWNER_ID
2。让我们进一步假设至少有一个PET
记录OWNER_ID
也是 2,引用这个特定的OWNER
记录。您不能删除OWNER
who OWNER_ID
is 2,因为这会导致违反完整性约束,因为它被PET
. 因此,您要么先删除引用,要么将其PET
更改为在执行后OWNER_ID
引用实际值的内容。同样,出于同样的原因,您也不能是2。OWNER
delete
update
OWNER_ID
OWNER
OWNER_ID
示例 3
让我们假设有一个OWNER
为OWNER_ID
3 和一个PET
也OWNER_ID
为 3。如果我们更新PET.OWNER_ID
到 4,那么当且仅当存在OWNER
who OWNER_ID
is 4 时它才会成功。否则它将违反完整性约束并失败。
示例 4
假设我们尝试插入一个为 5PET
的a。当且仅当一个为5 的 a 存在时OWNER_ID
,它才会成功。否则它将由于违反完整性约束而失败。OWNER
OWNER_ID
概括
由于您尝试对insert
child执行 an table
,因此您的问题与示例 4 等效,即您尝试将insert
记录写入 child table
,将 parent 引用为 parent中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
第一个,或从脚本中删除孤儿插入。
推荐阅读
- reactjs - 获取 TypeError:无法读取未定义的属性“地图”
- linux - 如果在终端中输入而不是复制和粘贴,Bash 命令会产生不同的结果
- c - 时间序列堆叠——C算法优化
- xcode - Xcode:scheme 没有可执行文件
- storage - 涉足 HBA 驱动程序开发
- java - Spring Web - 类级 RequestMapping 不起作用
- python - 如果作为 Python 子进程调用,多线程 Perl 脚本会导致管道损坏
- botframework - 如何在 C# - CoreBot 中构造 QnA Maker 实例类?
- php - 未找到 opencart 自定义控制器
- php - Laravel firstOrNew 使用like运算符