【问题标题】:How to update a column which is also a primary key?如何更新也是主键的列?
【发布时间】:2018-03-15 10:55:30
【问题描述】:

UI 中有一个名称字段,它也是基础表中的主键列。需要使该字段在 UI 中可编辑。应该有一个 ID 应该作为主键,但是没有,现在引入任何 ID 列都不可行。

有没有其他的设计理念可以在这种情况下使用?

UI 是 Swing,DB 是 Oracle。

【问题讨论】:

  • 更新主键没有任何意义
  • 是的,它没有。但是是否有任何替代设计模式可以实现类似的功能?正如我所说,根据产品更改数据模型以引入 ID 也是不可行的。
  • 可以更新一个PK列。你的问题到底是什么?这样做时会出现什么错误?
  • 我没有收到任何错误,但是更新 PK 列的成本会非常高,因为我必须更新所有引用此键的外键。外键已编入索引,因此我相信我也需要更新索引。
  • PK 引用了多少外键?更新索引是什么?

标签: oracle database-design primary-key


【解决方案1】:

首先我不知道,谁认为Name字段可以是Primary Key。那是错误的数据库设计。

是的,您最好将其更改为 ID 列作为 Primary Key 并且将来不应更新。因为,你不能有多个Primary Key。所以,你需要在这里表演一些马戏团。

  • 您需要先drop 现有的Primary Key。因为,您不能在单个表中拥有多个 Primary Key

  • 创建您的ID 列并允许NULL

  • 然后,用序列更新此列。

  • 一旦您的ID 列被填充,您需要在此列上创建Primary Key

【讨论】:

  • 感谢您的回复。但是这样做几乎没有问题。这是一个遗留产品,使用名称作为主键有一些特定的原因。由于您建议的方法应该是理想的方法,但我们无法通过它,因为它会涉及巨大的数据模型更改。是否有任何替代解决方案?
  • @NinadSinghNegi 目前我想不出任何其他选择。
【解决方案2】:

您只能有一个主键,但您可以在一张表上拥有任意数量的唯一索引。所以让现有的主键成为不可变的主键,并让应用程序在内部使用这个键来做所有事情。向表中添加另一列并在其上创建唯一索引。让用户修改这个其他字段。

另一种选择是在 UPDATE CASCADE 上声明所有具有外键的子表。这样,对主键的任何更新都将级联到子表。一旦在生产环境中实施,退出公司并快速转向另一个方向,并写一篇关于您如何成为第一个在生产环境中使用 ON UPDATE CASCADE 的人的文章。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-15
    • 2014-07-14
    • 1970-01-01
    • 2015-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多