Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 当存在子记录时,是否可以在Oracle中修改记录主键的值?_Sql_Oracle - Fatal编程技术网

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

Sql 当存在子记录时,是否可以在Oracle中修改记录主键的值?,sql,oracle,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 ke

我有一些表示父子关系的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)
);
这是一个实时数据库,其模式在很久以前就被设计为假设父id字段对于给定记录是静态的和不变的。现在规则已经改变了,我们真的想更改一些记录的parent_id的值

例如,我有以下记录:

Parent:

parent_id
---------
ABC123


Child:

child_id  parent_id
--------  ---------
1         ABC123
2         ABC123
我想将两个表中这些记录中的ABC123修改为其他内容

我的理解是,不能编写同时更新父表和子表的Oracle update语句,并且考虑到FK约束,我不确定如何最好地更新数据库。我目前正在禁用fk_parent_id约束,独立更新每个表,然后启用该约束


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

没有级联更新

你可以用一个小盒子

或者,在交易中:

使用新键将父级复制到新行:

插入到父项中,cols。。。 选择newkey,cols。。。 来自父母 其中key=oldkey

分配所有子项:

更新子项 设置父项\u id=newkey 其中parent_id=oldkey

现在没有人引用父对象,请删除该父对象:

删除 来自父母 其中key=oldkey


请参阅。

如果您发现需要频繁更新主键,则可能需要重新考虑您的模型并使用真正的不可变主键。使用一个带有代理键的列,该代理键不意味着递增标识列或GUID,并将要更新的值仅存储在父表中,以便在需要更新时,只需修改一行。

Tom Kyte提供了一个实用程序来实现更新级联功能。

我假设,因为它是一个旧表对模式进行修改可能是不可行的,即使这样做是正确的。父级中约有60万行,子级中约有2000万行,它们是相当广泛的记录。我现在也不确定有多少进程依赖于当前模式——可能是几十个单独的小实用程序脚本和两个更大的应用程序。我的猜测是,可能需要一段时间来识别所有这些,更新模式,并更新流程以期望新模式。这就是为什么我希望得到一个简单的解决方案我同意你的建议大体上是个好建议。是的,我同意。这是一个最初由供应商提供的模式,但随着时间的推移,我们已经对其进行了修改。如果这些新的更改真的很麻烦,我想我会花时间创建一些对数据用户没有意义的单独密钥。