如何在 Oracle 中重命名主键值?
-
13-09-2019 - |
题
我们的应用程序使用 Oracle 10g 数据库,其中多个主键向最终用户公开。产品代码等。不幸的是,现在对此采取任何行动都为时已晚,因为有大量我们无法控制的报告和自定义脚本。我们不能重新定义主键或弄乱数据库结构。
现在有些客户想要更改一些主键值。他们最初想要称为 P23A1 的东西现在应该称为 CAT23MOD1(不是一个真实的例子,但你明白我的意思。)
是否有捷径可寻?我更喜欢某种类型的脚本,可以对其进行参数化以适合其他表和键,但如果不存在其他方法,则外部工具也是可以接受的。
解决方案
问题可能出在引用 PK 的外键上。您必须将外键定义为“可延迟初始立即”,如这篇 Tom Kyte 文章中所述: http://www.oracle.com/technology/oramag/oracle/03-nov/o63asktom.html这让你...
- 推迟约束
- 修改父值
- 修改子值
- 提交更改
简单的。
其他提示
<强>糟糕。一个小Googling使它看起来是,莫名其妙地,Oracle不执行ON UPDATE CASCADE,只有ON DELETE CASCADE。:要找到解决方法谷歌甲骨文UPDATE CASCADE。这里有 在Oracle中创建表的级联更新集的链接。
原来的答复:
如果我理解正确的话,你想改变主键列,而不是按键的实际约束名称数据的值的自己。
如果这是事实,就可以很容易地被重新定义所有引用受影响的主键约束作为ON UPDATE CASCADE
外键来完成的。这意味着,当您更改主键的值时,发动机会自动外键的表更新所有相关的值。
请注意,如果这导致了很大的变化也可能是在生产系统中非常昂贵的。
如果您必须在实时系统上执行此操作,并且不对所涉及的表进行 DDL 更改,那么我认为您唯一的选择是(对于需要更改的 PK 的每个值):
- 将替换 PK 值的行的副本插入到父表中
- 对于每个子表,将FK值更新为新的PK值
- 删除具有旧 PK 值的父表行
如果您有父表和要重命名的 PK 值的列表,那么编写执行此操作的过程应该不会太难 - USER_CONSTRAINTS 中的信息可用于获取给定父表的 FK 相关表。