我有一个带主键(main
)的ÍD
表和一个linked
表。
现有数据
主要
ID | name
=========
1 | foo
2 | bar
3 | loo
4 | zoo
链接的
main_id
=======
1
1
2
2
有到
main
表中linked
(1,2)的第一个条目的连接。现在,从同一结构导入新数据:
导入数据
ID | name
=========
1 | new_foo
2 | new_bar
3 | new_loo
4 | new_zoo
和
main_id
=======
3
4
3
1
在导入过程中,
ID
表的main
s将获得新的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
因为它也会更新前两行。
那么,如何将这些字段映射为新的主ID
main
?我可以在导入
main_id
做导入
应用真实ID
UPDATE linked SET main_id = main_id + 10000000
把我的临时身份证还给原件。
UPDATE linked SET main_id = %realID WHERE main_id = %importedID
问题很明显:如果id高于10.000.000或者临时id高于BIGINT(9223372036854775807),那么这个方法就不能很好地工作(或者根本不能工作)。
它可以使用表的克隆,但这可能会导致内存消耗问题,因为
UPDATE linked SET main_id = main_id - 10000000 WHERE main_id > 10000000
表可能会变得很大。我肯定有一个“最佳实践”的方法。
最佳答案
步骤如下:
在Main
表中选择最后一个ID:select @lastId := max(ID) from Main;
只需将要写入Linked
表的所有id移动@lastId
。
像这样:insert into Linked select ID + @lastId from Imported_linked_data
不需要额外的步骤。