oracle - 无法验证 - 未找到父键
问题描述
我的数据库中有以下表格:
CREATE TABLE "ALMAT"."ORDER"
( "ID" NUMBER(*,0) NOT NULL ENABLE,
"CUSTOMER_ID" NUMBER(*,0),
"CREATE_DATE" DATE,
"UPDATE_DATE" DATE,
"STATUS_ID" NUMBER(*,0),
CONSTRAINT "order_PK" PRIMARY KEY ("ID")
CONSTRAINT "FK_ORDER" FOREIGN KEY ("STATUS_ID")
REFERENCES "ALMAT"."ORDER_STATUS" ("ID") ENABLE
)
CREATE TABLE "ALMAT"."ORDER_ITEM"
( "ID" NUMBER(*,0) NOT NULL ENABLE,
"ORDER_ID" NUMBER(*,0),
"PRODUCT_ID" NUMBER(*,0),
CONSTRAINT "ORDER_ITEM_PK" PRIMARY KEY ("ID"))
CREATE TABLE "ALMAT"."PRODUCT"
( "ID" NUMBER(*,0) NOT NULL ENABLE,
"NAME" VARCHAR2(50 BYTE),
"PRICE" NUMBER(*,0),
"DESCRIPTION" VARCHAR2(180 BYTE),
"CREATE_DATE" DATE,
"UPDATE_DATE" DATE,
"CATEGORY_ID" NUMBER(*,0),
"STATUS_ID" NUMBER(*,0),
"DISCOUNT_ID" NUMBER(*,0),
CONSTRAINT "PRODUCT_PK" PRIMARY KEY ("ID")
CONSTRAINT "FK_STATUS" FOREIGN KEY ("STATUS_ID")
REFERENCES "ALMAT"."PRODUCT_STATUS" ("ID") ENABLE,
CONSTRAINT "FK_DISCOUNT" FOREIGN KEY ("DISCOUNT_ID")
REFERENCES "ALMAT"."DISCOUNT" ("ID") ENABLE
)
当我尝试向 ORDER_ITEM 添加约束时抛出错误:“由于表有子记录,更改表验证约束失败。”
alter table order_item
add constraint fk_orderitem_productid
foreign key (product_id)
references product(id);
alter table order_item
add constraint fk_orderitem_orderid
foreign key (order_id)
references "ORDER"(id);
除此之外,我尝试删除与父表不匹配的记录,但这不起作用:
delete from order_item where exists(
SELECT DISTINCT order_id FROM order_item WHERE order_id NOT IN (
SELECT id FROM "ORDER")
)
解决方案
我们不要假设以下情况
alter table order_item
add constraint fk_orderitem_orderid
foreign key (order_id)
references "ORDER"(id);
ORA-02298: cannot validate (ALMAT.FK_ORDERITEM_ORDERID) - parent keys not found
*Cause: an alter table validating constraint failed because the table has
child records.
这意味着:
您有ORDER_ITEM
一个在“ORDER”中不存在的 ORDER_ID。您可以通过以下查询发现这些 ID
SELECT ORDER_ID from "ORDER_ITEM"
MINUS
SELECT ID from "ORDER"
要摆脱这些行,请执行以下操作
DELETE from order_item
WHERE ORDER_ID in
(SELECT ORDER_ID from "ORDER_ITEM"
MINUS
SELECT ID from "ORDER"
);
1 row deleted.
现在您可以安全地添加约束
alter table order_item
add constraint fk_orderitem_orderid
foreign key (order_id)
references "ORDER"(id);
Table ORDER_ITEM altered.
推荐阅读
- javascript - 为nodejs csv文件创建生成缓冲区的问题
- python - 是否可以从多个蝗虫奴隶将日志写入单个文件?
- java - Spring JPA 复合键:此类未定义 IdClass
- c# - 是否有技术原因 C# 没有类似于对象初始化程序的属性设置器简写,或者它只是一个设计选择?
- c# - 即时忽略牛顿 Json 的 JsonProperty?
- mongodb - mongodb查找给出空数组
- angular - 如何根据 Typescript 代码创建一个具有 onclick 功能的按钮?
- mysql - MySQL存储过程来清理表的数据?
- git - 如何让评论仅在本地而不是远程(推送时)出现在文件中?
- c# - 将 RouteValues 从 Action 传递到 HTML BeginForm