我有一个 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可能会很大。
我肯定有一个“最佳实践”的方法。
2条答案
按热度按时间nzk0hqpo1#
您可以在
Main
表,并让auto\u increment列生成新行的id(正如它应该的那样)。对于每一行,在关联数组中缓存生成的id,关联数组将旧idMap到新生成的id。然后插入
linked
table。在添加新行之前,根据创建的关联数组将旧外键id替换为新生成的id。qyswt5oh2#
步骤如下:
选择中的最后一个id
Main
表格:select @lastId := max(ID) from Main;
只要移动所有要写入的IDLinked
表,按@lastId
. 像这样:insert into Linked select ID + @lastId from Imported_linked_data
不需要额外的步骤。