在Oracle中更改主键

时间:2015-06-16 16:35:29

标签: oracle django-models oracle-sqldeveloper

我正在更新最初设计不佳的表格。该表当前有一个主键,即供应商的名称。这可以作为许多其他表的外键。这导致了最初输入错误的供应商名称或需要修复的拼写错误的问题。由于它是关系的外键,这比它的价值更复杂。

当前架构: Vendor_name(pk)Vendor_contact comments

所需架构: id(pk)Vendor_name Vendor_contact comments

我想将主键更新为自动生成的数字键。供应商名称字段需要保留但不再是关键字。我还需要更新其他表和连接表上的外键值。

最好的方法是在我的Vendor表上创建一个新的数字id列,将id交叉到供应商名称,并添加一个新的外键,新的id作为外键,删除供应商名称的外键在这些表上(每this post),然后以某种方式将id标记为主键并取消标记供应商名称?

或者是否有一种更简化的方式来做到这一点并没有如此突破?

重要的是要注意,只有5个用户可以访问此表,以便我可以在进行这些更新时轻松将其关闭一段时间 - 这不是问题。

我正在使用SQLDeveloper和Python / Django。

2 个答案:

答案 0 :(得分:0)

我会这样做:

  • 创建新序列
  • 创建表格temp,选择your_sequence.nextval,vendor_name,vendor_contact,供应商的评论。
  • 将原始表重命名为vendor_old
  • 将主键和其他约束添加到新表
  • 将新表重命名为旧名称

测试是必不可少的,除非你这样做,否则你必须确保没有人在使用数据库。

答案 1 :(得分:0)

您遇到的最大问题是在从属表中引用VENDOR_NAME的所有应用程序代码。不只是使用它来加入父表,而且还依赖它来显示名称而不加入VENDOR。

因此,尽管将自然键作为外键是PITN,但改变这种情况可能会产生大量的工作,并带来边际的整体效益。在开始之前一定要得到所有利益相关者的支持。

我接近它的方式是:

  1. 进行真正彻底的影响分析
  2. 确保您对依赖于供应商数据的所有功能进行完整的回归测试
  3. 在VENDOR上创建VENDOR_ID作为唯一键
  4. 将VENDOR_ID添加到所有相关表
  5. 在引用VENDOR_ID
  6. 的所有相关表上创建第二个外来
  7. 确保在VENDOR_NAME出现时填充VENDOR_ID。
  8. 可以通过修复依赖表上的insert和update语句或使用触发器来解决最后一点。您采用哪种方法将决定您的应用程序设计以及所涉及的表的数量。显然,如果可以的话,你想要避免所有这些触发器的性能损失。

    此时,您有一个支持新主键但仍使用旧主键的基础结构。你为什么想做这个?因为您可以在不更改应用程序代码的情况下进入生产环境。它为您提供了移动应用程序代码以在更广泛的时间范围内使用VENDOR_ID的选项。显然,如果开发人员一直热衷于编码SELECT * FROM,那么您将遇到需要立即解决的问题。

    修复完所有代码后,您可以从所有相关表中删除VENDOR_NAME,并将VENDOR_NAME切换为唯一密钥,将VENDOR_ID切换为主表上的主键。

    如果您使用的是11g,则应查看基于版本的重新定义。它旨在使这种练习变得更加容易。 Find out more