我正在更新最初设计不佳的表格。该表当前有一个主键,即供应商的名称。这可以作为许多其他表的外键。这导致了最初输入错误的供应商名称或需要修复的拼写错误的问题。由于它是关系的外键,这比它的价值更复杂。
当前架构: Vendor_name(pk)Vendor_contact comments
所需架构: id(pk)Vendor_name Vendor_contact comments
我想将主键更新为自动生成的数字键。供应商名称字段需要保留但不再是关键字。我还需要更新其他表和连接表上的外键值。
最好的方法是在我的Vendor表上创建一个新的数字id列,将id交叉到供应商名称,并添加一个新的外键,新的id作为外键,删除供应商名称的外键在这些表上(每this post),然后以某种方式将id标记为主键并取消标记供应商名称?
或者是否有一种更简化的方式来做到这一点并没有如此突破?
重要的是要注意,只有5个用户可以访问此表,以便我可以在进行这些更新时轻松将其关闭一段时间 - 这不是问题。
我正在使用SQLDeveloper和Python / Django。
答案 0 :(得分:0)
我会这样做:
测试是必不可少的,除非你这样做,否则你必须确保没有人在使用数据库。
答案 1 :(得分:0)
您遇到的最大问题是在从属表中引用VENDOR_NAME的所有应用程序代码。不只是使用它来加入父表,而且还依赖它来显示名称而不加入VENDOR。
因此,尽管将自然键作为外键是PITN,但改变这种情况可能会产生大量的工作,并带来边际的整体效益。在开始之前一定要得到所有利益相关者的支持。
我接近它的方式是:
可以通过修复依赖表上的insert和update语句或使用触发器来解决最后一点。您采用哪种方法将决定您的应用程序设计以及所涉及的表的数量。显然,如果可以的话,你想要避免所有这些触发器的性能损失。
此时,您有一个支持新主键但仍使用旧主键的基础结构。你为什么想做这个?因为您可以在不更改应用程序代码的情况下进入生产环境。它为您提供了移动应用程序代码以在更广泛的时间范围内使用VENDOR_ID的选项。显然,如果开发人员一直热衷于编码SELECT * FROM
,那么您将遇到需要立即解决的问题。
修复完所有代码后,您可以从所有相关表中删除VENDOR_NAME,并将VENDOR_NAME切换为唯一密钥,将VENDOR_ID切换为主表上的主键。
如果您使用的是11g,则应查看基于版本的重新定义。它旨在使这种练习变得更加容易。 Find out more