我正在尝试编写一个PL/SQL过程,用于从供应商表中查找现有主键“supplier_id”并将其替换为新的主键。主键“supplier_id”也是其他几个表的外键。因此我需要更新外键位置。这是我写来解决这个问题的过程:替换主键PL SQL
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;
的过程给了我以下错误:
Error starting at line : 2 in command - BEGIN ex5b_supplier_update('S500','S600');
END;
Error report - ORA-02292: integrity constraint (SYSTEM.PRODUCT_FK) violated - child record found ORA-06512: at "SYSTEM.EX5B_SUPPLIER_UPDATE", line 15 ORA-06512: at line 2 02292. 00000 - "integrity constraint (%s.%s) violated - child record found" *Cause: attempted to delete a parent key value that had a foreign dependency. *Action: delete dependencies first then parent or disable constraint.
总而言之,您无法删除用作外键的主键。但是我也无法更改没有主键的外键。
所以我的问题是我怎么能改变supplier_id和它的所有外键在同一时间,以避免这个错误?
1.插入新的父项。 2.将孩子更新为新父母。 3.删除旧的父母。希望没有人在步骤2和步骤3之间添加新的孩子。或者推迟约束。 –