如何在Oracle中重命名主键值?

时间:2009-12-04 19:37:56

标签: sql database oracle primary-key rename

我们的应用程序使用Oracle 10g数据库,其中几个主键向最终用户公开。产品代码等。不幸的是,由于有大量的报告和自定义脚本我们无法控制,因此要对此做任何事情都要迟到。我们无法重新定义主键或搞乱数据库结构。

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

有一种简单的方法吗?我更喜欢某种类型的脚本,可以参数化以适应其他表和键,但如果不存在其他方式,外部工具是可以接受的。

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

<强>糟糕。有点谷歌搜索使得看起来,莫名其妙地,Oracle没有实现ON UPDATE CASCADE,只有ON DELETE CASCADE。要找到变通方法google ORACLE ON UPDATE CASCADE。这是Oracle中Creating A Cascade Update Set of Tables的链接。

原始答案:

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

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

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

答案 2 :(得分:0)

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

  1. 在父表中插入已替换PK值的行的副本
  2. 对于每个子表,将FK值更新为新的PK值
  3. 删除具有旧PK值的父表行
  4. 如果您有父表的列表和要重命名的PK值,编写执行此操作的过程应该不会太难 - USER_CONSTRAINTS中的信息可用于获取与FK相关的表给父表。