1

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

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

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

4

3 回答 3

4

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

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

简单的。

于 2009-12-05T09:39:33.687 回答
0

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

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

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

于 2009-12-04T20:27:12.037 回答
0

哎呀。谷歌搜索一下,令人费解的是,Oracle 没有实现 ON UPDATE CASCADE,只实现了 ON DELETE CASCADE。 要查找解决方法,请使用 google ORACLE ON UPDATE CASCADE。这是在 Oracle 中创建表的级联更新集的链接。

原答案:

如果我理解正确,您想更改主键列中的数据,而不是键本身的实际约束名称。

如果这是真的,那么最容易将引用受影响的主键约束的所有外键重新定义为ON UPDATE CASCADE. 这意味着当您对主键值进行更改时,引擎将自动更新外键表中的所有相关值。

请注意,如果这会导致大量更改,则在生产系统中可能会非常昂贵。

于 2009-12-04T20:04:57.000 回答