【问题标题】:Replacing Primary Key PL SQL替换主键 PL SQL
【发布时间】: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 步之间添加了新的孩子。或可延迟的约束。

标签: oracle plsql


【解决方案1】:

在关系数据库中,主键保证是三样东西:

1) Not nullable
2) Unique
3) UNCHANGING

这是您在这里违反的第三条规则,从您遇到的错误中也许您知道原因。这种方式是疯狂的。 不要更改主键的值。随心所欲地更改属性值,以便该行现在看起来完全不同 - 但不要更改主键。如果您认为您需要更改主键,那么您真正想说的是您的主键实际上不是主键。它可能是唯一键,但根据定义它不是主键。

不会更改主键

祝你好运。

编辑

如果您真的想在不禁用约束等的情况下“更改”主键,请执行以下操作:

  1. 开始交易。
  2. 使用新 ID 在表中创建一个新行。
  3. 将除主键 ID 列之外的所有属性从“原始”行复制到“新”行。
  4. 使用引用“原始”行的外键约束更新表中的所有行以引用“新”行,即将“旧”ID 值更改为“新”ID 值。
  5. 删除“原始”行。
  6. 提交事务。

以这种方式完成时,您不会违反任何有关主键的规则,并且在事务结束时,主键似乎已更改,并且所有 FK 都已更新。

祝你好运。

【讨论】:

  • 有办法做到,这是我作业的要求。你当然不应该这样做,但我没有问你是否应该这样做,我问的是我怎么能。
  • 唯一的方法是禁用依赖故事的所有外键约束并继续进行更改,并确保在启用外键约束之前将相应的主键值放入所有依赖项表,然后启用外键约束。但这根本不能用主键玩。
  • @user2725919:已编辑以显示如何在不违反主键规则或禁用约束的情况下执行此操作。祝你好运。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-09
  • 1970-01-01
  • 2017-08-08
  • 1970-01-01
  • 1970-01-01
  • 2019-05-23
  • 1970-01-01
相关资源
最近更新 更多