当存在子记录时,是否可以在Oracle中修改记录主键的值?

Chr*_*mer 2 sql oracle

我有一些代表父子关系的Oracle表.他们看起来像这样:

create table Parent (
    parent_id varchar2(20) not null primary key
);

create table Child (
    child_id number not null primary key,
    parent_id varchar2(20) not null,

    constraint fk_parent_id
        foreign key (parent_id)
        references Parent (parent_id)
);
Run Code Online (Sandbox Code Playgroud)

这是一个实时数据库,其架构很久以前就是在假设该parent_id字段对于给定记录是静态且不变的情况下设计的.现在规则已经改变,我们真的想改变parent_id一些记录的价值.

例如,我有这些记录:

Parent:

parent_id
---------
ABC123


Child:

child_id  parent_id
--------  ---------
1         ABC123
2         ABC123
Run Code Online (Sandbox Code Playgroud)

我想ABC123在两个表中的这些记录中修改其他内容.

我的理解是,无法编写将同时更新父表和子表的Oracle更新语句,并且在给定FK约束的情况下,我不确定如何最好地更新我的数据库.我目前正在禁用fk_parent_id约束,独立更新每个表,然后启用约束.

是否有更好的单步方式来更新此内容?

Cad*_*oux 6

没有级联更新.

您可以使用可延迟约束.

或者,在交易中:

  • 使用新密钥将Parent复制到新行:

    INSERT INTO Parent(key,cols ...)SELECT newkey,cols ... FROM Parent WHERE key = oldkey

  • 分配所有孩子:

    UPDATE Child SET parent_id = newkey WHERE parent_id = oldkey

  • 现在删除父级,没有人引用它:

    DELETE FROM Parent WHERE key = oldkey

看到这个链接.