【问题标题】:How to add an auto incremented primary key as a foreign key to existing database tables?如何将自动递增的主键作为外键添加到现有数据库表?
【发布时间】:2020-11-20 14:08:42
【问题描述】:

我得到了三个使用外键约束正确连接的mysql数据库表,如下所示:

但问题是外键受非整数和自增类型字段约束,而是全部为 varchar 类型。

我试图不阻止对已经正确映射的这些表重新进行映射,而是想添加一个新的整数类型和唯一的主键和外键。这样所有表中的所有数据都保持不变。请让我知道我是否可以通过任何方式运行可以使用新的主键和外键自动映射现有表的脚本。

我尝试在基表上添加主键

ALTER TABLE videofile ADD id int NOT NULL AUTO_INCREMENT primary key;

这将向基表添加一个新的主键,但我希望新添加的主键作为基于现有映射键和数据的其他表的 FK。如果有任何脚本可以自定义此需求,请告诉我。

【问题讨论】:

  • 为什么你觉得需要行标识符?是否存在推动变化的存储或其他考虑因素?
  • @bbaird:因为一些 java 脚本库需要 int 字段来绑定数据,而不是现在触发此问题的文本
  • Aren't them many:many -- 即一个视频有很多主题,一个主题与很多视频相关联?
  • 此任务需要自定义代码。您需要 1) 删除外键约束。 2) 将标识符添加到主题表中。 3) 将标识符添加到视频表中。 4) 将标识符添加到 elan 表中。 5) 为视频表创建外键。 6) 为 elan 表创建外键。 7)删除现有的外键。 8) 添加新的外键和外键约束。 9) 删除主索引并创建新的主索引。
  • 选择支持 SQL 的编程语言。就像我说的,该任务需要经过测试和重新测试的自定义代码。您可以尝试通过 Workbench 执行此操作,但太容易出错了。

标签: mysql database-design foreign-keys


【解决方案1】:

这将需要重建表格,因此您必须撕下创可贴。与往常一样,在进行更改之前测试 DDL。

  1. 使用新的键结构创建表的新版本:SubjectId/VideoId/<whatever>Id 作为主键,旧主键作为备用键(唯一约束)。我们将使用后缀 _new 来引用它们。
  2. 锁定表或使数据库脱机。
  3. 首先将Subject中的数据加载到Subject_New中。然后,将Subject_New 加入Video 以获取要插入Video_New 的新密钥。
  4. 对依赖于Video 的表重复相同的步骤。
  5. 禁用旧表中的任何依赖项/约束并将其应用于新表。
  6. Rename 旧表到 <table>_old 并从您刚刚创建的表中删除 _new 后缀。
  7. 重新上线。

【讨论】:

  • 您认为新的 PK-FK 会保留现有表的关系吗?甚至添加新的。
  • 只要您确保对旧 PK 列具有唯一约束,新列就充当该键的 代理项,并且只要您将该代理项关联到子表,它将有效地强制执行先前的关系。
  • 当您创建新版本的表时,您将创建使用新 PK 强制执行关系所需的 FK 约束,并且您将在插入任何数据之前执行此操作。
猜你喜欢
  • 2015-11-13
  • 2023-03-26
  • 2016-07-03
  • 2011-06-19
  • 2011-02-26
  • 2020-09-01
  • 2013-02-04
  • 2016-09-11
相关资源
最近更新 更多