我们的应用程序使用 Oracle 10g 数据库,其中向最终用户公开了几个主键。产品代码等。不幸的是,现在做任何事情都为时已晚,因为那里有大量我们无法控制的报告和自定义脚本。我们不能重新定义主键或搞乱数据库结构。
现在有些客户想要更改一些主键值。他们最初想称为 P23A1 的东西现在应该称为 CAT23MOD1(不是一个真实的例子,但你明白我的意思。)
是否有捷径可寻?我更喜欢某种脚本,可以对其进行参数化以适应其他表和键,但如果不存在其他方法,外部工具也是可以接受的。
我们的应用程序使用 Oracle 10g 数据库,其中向最终用户公开了几个主键。产品代码等。不幸的是,现在做任何事情都为时已晚,因为那里有大量我们无法控制的报告和自定义脚本。我们不能重新定义主键或搞乱数据库结构。
现在有些客户想要更改一些主键值。他们最初想称为 P23A1 的东西现在应该称为 CAT23MOD1(不是一个真实的例子,但你明白我的意思。)
是否有捷径可寻?我更喜欢某种脚本,可以对其进行参数化以适应其他表和键,但如果不存在其他方法,外部工具也是可以接受的。
问题可能与引用 PK 的外键有关。您必须将外键定义为“最初立即可延迟”,如 Tom Kyte 文章中所述:http ://www.oracle.com/technology/oramag/oracle/03-nov/o63asktom.html 这让您...
简单的。
如果您必须在没有对所涉及的表进行 DDL 更改的实时系统上执行此操作,那么我认为您唯一的选择是(对于需要更改的每个 PK 值):
如果您有一个父表列表和要重命名的 PK 值,那么编写一个执行此操作的过程应该不会太难 - USER_CONSTRAINTS 中的信息可用于获取给定父表的 FK 相关表.
哎呀。谷歌搜索一下,令人费解的是,Oracle 没有实现 ON UPDATE CASCADE,只实现了 ON DELETE CASCADE。 要查找解决方法,请使用 google ORACLE ON UPDATE CASCADE。这是在 Oracle 中创建表的级联更新集的链接。
原答案:
如果我理解正确,您想更改主键列中的数据值,而不是键本身的实际约束名称。
如果这是真的,那么最容易将引用受影响的主键约束的所有外键重新定义为ON UPDATE CASCADE
. 这意味着当您对主键值进行更改时,引擎将自动更新外键表中的所有相关值。
请注意,如果这会导致大量更改,则在生产系统中可能会非常昂贵。