我们的应用程序使用 Oracle 10g 数据库,其中多个主键向最终用户公开。产品代码等。不幸的是,现在对此采取任何行动都为时已晚,因为有大量我们无法控制的报告和自定义脚本。我们不能重新定义主键或弄乱数据库结构。

现在有些客户想要更改一些主键值。他们最初想要称为 P23A1 的东西现在应该称为 CAT23MOD1(不是一个真实的例子,但你明白我的意思。)

是否有捷径可寻?我更喜欢某种类型的脚本,可以对其进行参数化以适合其他表和键,但如果不存在其他方法,则外部工具也是可以接受的。

有帮助吗?

解决方案

问题可能出在引用 PK 的外键上。您必须将外键定义为“可延迟初始立即”,如这篇 Tom Kyte 文章中所述: http://www.oracle.com/technology/oramag/oracle/03-nov/o63asktom.html这让你...

  1. 推迟约束
  2. 修改父值
  3. 修改子值
  4. 提交更改

简单的。

其他提示

<强>糟糕。一个小Googling使它看起来是,莫名其妙地,Oracle不执行ON UPDATE CASCADE,只有ON DELETE CASCADE。:要找到解决方法谷歌甲骨文UPDATE CASCADE。这里有 在Oracle中创建表的级联更新集的链接。

原来的答复:

如果我理解正确的话,你想改变主键列,而不是按键的实际约束名称数据的的自己。

如果这是事实,就可以很容易地被重新定义所有引用受影响的主键约束作为ON UPDATE CASCADE外键来完成的。这意味着,当您更改主键的值时,发动机会自动外键的表更新所有相关的值。

请注意,如果这导致了很大的变化也可能是在生产系统中非常昂贵的。

如果您必须在实时系统上执行此操作,并且不对所涉及的表进行 DDL 更改,那么我认为您唯一的选择是(对于需要更改的 PK 的每个值):

  1. 将替换 PK 值的行的副本插入到父表中
  2. 对于每个子表,将FK值更新为新的PK值
  3. 删除具有旧 PK 值的父表行

如果您有父表和要重命名的 PK 值的列表,那么编写执行此操作的过程应该不会太难 - USER_CONSTRAINTS 中的信息可用于获取给定父表的 FK 相关表。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top