我有一个带有主键(main
)和ÍD
的{{1}}表。
现有数据
主要
linked
已链接
ID | name
=========
1 | foo
2 | bar
3 | loo
4 | zoo
与main_id
=======
1
1
2
2
表中main
(1,2)的第一项的连接。
现在从相同结构导入新数据:
导入数据
linked
和
ID | name
=========
1 | new_foo
2 | new_bar
3 | new_loo
4 | new_zoo
在导入过程中,main_id
=======
3
4
3
1
表的ID
将获得新的ID(由脚本完成)
main
但是ID | name
=========
1 | foo
2 | bar
3 | loo
4 | zoo
5 | new_foo
6 | new_bar
7 | new_loo
8 | new_zoo
仍将具有导入数据中的ID:
main_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
因为它也会更新前两行。
那我该如何使用新的主ID UPDATE linked SET main_id = 5 WHERE main_id = 1
映射这些字段?
在导入之前,我可以在main
上添加一个较大的数字
main_id
执行导入
应用真实ID
UPDATE linked SET main_id = main_id + 10000000
将我的临时ID恢复为原始ID。
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
表可能变得很大,因此可能会导致内存消耗问题。
我敢肯定有一种“最佳实践”方法。
答案 0 :(得分:1)
步骤是:
选择Main
表中的最后一个ID:select @lastId := max(ID) from Main;
只需将要写入Linked
表中的所有ID移@lastId
。
像这样的东西:insert into Linked select ID + @lastId from Imported_linked_data
不需要额外的步骤。
答案 1 :(得分:0)
您可以在Main
表中添加新条目,并让AUTO_INCREMENT列生成新行的ID(应如此)。对于每一行,您将生成的ID缓存在一个关联数组中,该数组将旧ID映射到新生成的ID。
之后,您插入linked
表的条目。在添加新行之前,您需要根据创建的关联数组将旧的外键ID替换为新生成的ID。