无冲突地重新分配外部id

wsxa1bj1  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(252)

我有一个 main 具有主键的表( ÍD )和一个 linked 一个。
现有数据
主要的

ID | name
=========
1  | foo
2  | bar
3  | loo
4  | zoo

链接

main_id
=======
     1
     1
     2
     2

有到的第一个条目的连接 main (1,2)在 linked table。
现在从同一结构导入新数据:
导入数据

ID | name
=========
1  | new_foo
2  | new_bar
3  | new_loo
4  | new_zoo

main_id
=======
     3
     4
     3
     1

在导入过程中 ID 是的 main 表将获得新的ID(由脚本完成)

ID | name
=========
1  | foo
2  | bar
3  | loo
4  | zoo
5  | new_foo
6  | new_bar
7  | new_loo
8  | new_zoo

但是 main_id 仍将具有导入数据的ID:

main_id
=======
     1 
     1 
     2 
     2 
     3  => should be 7
     4  => should be 8
     3  => should be 7
     1  => should be 5  => * comment below
  • 我不能简单的更新 linked 比如:
UPDATE linked SET main_id = 5 WHERE main_id = 1

因为它也会更新前两行。
那么,如何将这些字段Map到 main ?
我可以给这个数字加一个高的数字 main_id 导入前like UPDATE linked SET main_id = main_id + 10000000 进行导入
应用真实id UPDATE linked SET main_id = %realID WHERE main_id = %importedID 把我的临时身份证恢复原样。 UPDATE linked SET main_id = main_id - 10000000 WHERE main_id > 10000000 问题很明显:如果id高于10.000.000或者临时id高于bigint(9223372036854775807),那么这个方法就不起作用(或者根本不起作用)。
它可以与表的克隆一起工作,但这可能会导致内存消耗问题 linked table可能会很大。
我肯定有一个“最佳实践”的方法。

nzk0hqpo

nzk0hqpo1#

您可以在 Main 表,并让auto\u increment列生成新行的id(正如它应该的那样)。对于每一行,在关联数组中缓存生成的id,关联数组将旧idMap到新生成的id。
然后插入 linked table。在添加新行之前,根据创建的关联数组将旧外键id替换为新生成的id。

qyswt5oh

qyswt5oh2#

步骤如下:
选择中的最后一个id Main 表格: select @lastId := max(ID) from Main; 只要移动所有要写入的ID Linked 表,按 @lastId . 像这样: insert into Linked select ID + @lastId from Imported_linked_data 不需要额外的步骤。

相关问题