【问题标题】:Combine SQL Databases with Conflicting IDs结合具有冲突 ID 的 SQL 数据库
【发布时间】:2011-12-18 09:26:41
【问题描述】:

我有 2 个要合并的数据库。它们都具有相同的架构。 第二个数据库开始时的数据与第一个相同,但它们在特定日期有所不同。

问题是一些表的 id 继续从同一点自动递增,因此两个表对不同的数据使用相同的 id。我还应该提到,ID 在其他表中用作外键。

我在想我可以为第二个数据库中的每个 id 添加一个值来消除冲突。这是一种可接受的方式吗?如果是这样,最好的方法是什么。如果没有,有什么更好的方法。

【问题讨论】:

  • 我希望您知道克隆前的 id,因为这些初始 id 不应更改

标签: mysql database merge


【解决方案1】:

您可以为所有表的主键和外键值添加偏移量,注意

  1. 数据库处于脱机状态,不接受更改
  2. 您不会错过任何主键或外键字段
  3. 您显然在各处都添加了相同的偏移量。

更新语句示例:

UPDATE parent_tbl SET primary_key_col = primary_key_col + 5000;
UPDATE child_tbl SET foreign_key_col = foreign_key_col + 5000;
...
...
UPDATE parent_tbl_99 SET primary_key_col = primary_key_col + 5000;
UPDATE child_tbl SET_99 foreign_key_col = foreign_key_col + 5000;

在这种情况下,使用 ON UPDATE CASCADE 选项创建外键会非常有帮助。您只需修改主键列,更改就会传播到将它们作为外键引用的表。

FOREIGN KEY (localcol) REFERENCES parent_tbl (parent_col) ON UPDATE CASCADE

【讨论】:

    【解决方案2】:

    或者,在合并之前将其中一个数据库中的所有 id 加倍。这样做的好处是非常明显。您只需要在任何地方都这样做(包括外键),并且您通常可以告诉被省略的表,因为某些 id 会很奇怪。

    这可以推广到合并更多的数据库。比如三个数据库,一个应该是3的倍数,一个应该是+1的倍数,最后一个是+2的倍数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-12
      • 1970-01-01
      • 2016-03-02
      • 1970-01-01
      • 1970-01-01
      • 2011-04-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多