【发布时间】:2016-01-01 13:51:01
【问题描述】:
我正在尝试编写一个 PL/SQL 过程,该过程将从供应商表中查找现有主键“supplier_id”并将其替换为新主键。主键“supplier_id”也是一些其他表的外键。因此我也需要更新外键位置。这是我为解决这个问题而编写的程序:
create or replace PROCEDURE ex5b_supplier_update(supplier_id_delete IN VARCHAR2,
supplier_id_update IN VARCHAR2) IS
CURSOR supplier_cursor IS
SELECT supplier_id
FROM supplier;
supplier_row supplier_cursor%rowtype;
BEGIN
OPEN supplier_cursor;
LOOP
FETCH supplier_cursor INTO supplier_row;
EXIT WHEN supplier_cursor%notfound;
IF ex5b_supplier_exist(supplier_id_delete) THEN
UPDATE supplier
SET supplier_id = supplier_id_update
WHERE supplier_id = supplier_id_delete;
UPDATE PURCHASE_ORDER
SET supplier_id = supplier_id_update
WHERE supplier_id = supplier_id_delete;
UPDATE PRODUCT
SET supplier_id = supplier_id_update
WHERE supplier_id = supplier_id_delete;
DBMS_OUTPUT.PUT_LINE('UPDATED');
ELSE
DBMS_OUTPUT.PUT_LINE('NOT UPDATED');
END IF;
END LOOP;
CLOSE supplier_cursor;
END;
该过程给了我以下错误:
从第 2 行开始的错误命令 - 开始 ex5b_supplier_update('S500','S600');
结束;
错误报告 - ORA-02292:完整性约束 (SYSTEM.PRODUCT_FK) 违反 - 发现子记录 ORA-06512: 在 “SYSTEM.EX5B_SUPPLIER_UPDATE”,第 15 行 ORA-06512:第 2 行 02292. 00000 - “违反完整性约束 (%s.%s) - 找到子记录” *原因:试图删除具有外来的父键值 依赖。 *操作:先删除依赖项,然后删除父项或禁用约束。
这完全有道理,您不能删除用作外键的主键。但我也无法更改没有主键的外键。
所以我的问题是如何同时更改供应商 ID 及其所有外键以避免此错误?
【问题讨论】:
-
1.插入新的父级。 2. 将孩子更新为新的父母。 3. 删除旧父。希望没有人在第 2 步和第 3 步之间添加了新的孩子。或可延迟的约束。