重新分配外来ID,不会发生冲突

时间:2018-09-16 07:24:07

标签: php mysql

我有一个带有主键(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表可能变得很大,因此可能会导致内存消耗问题。

我敢肯定有一种“最佳实践”方法。

2 个答案:

答案 0 :(得分:1)

步骤是:

  1. 选择Main表中的最后一个ID:select @lastId := max(ID) from Main;

  2. 只需将要写入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。