代码之家  ›  专栏  ›  技术社区  ›  Xaver

重新分配外部ID而不发生冲突

  •  1
  • Xaver  · 技术社区  · 8 年前

    我有一个 main 具有主键的表( ÍD linked 一个。

    主要

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

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

    主要的 (1,2)在 链接 桌子。

    现在从同一结构导入新数据:

    导入数据

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

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

    在导入过程中 ID 是的 主要的 表将获得新的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

    main_id
    =======
         1 
         1 
         2 
         2 
         3  => should be 7
         4  => should be 8
         3  => should be 7
         1  => should be 5  => * comment below
    

    *我不能简单的更新 链接

    UPDATE linked SET main_id = 5 WHERE main_id = 1
    

    主要的 ?

    • 我可以给这个数字加一个高的数字 主id

      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),那么这个方法就不起作用(或者根本不起作用)。

    链接

    我肯定有一个“最佳实践”的方法。

    2 回复  |  直到 8 年前
        1
  •  1
  •   Michał Turczyn    8 年前

    步骤如下:

    1. Main 表格: select @lastId := max(ID) from Main;

    2. Linked @lastId 像这样: insert into Linked select ID + @lastId from Imported_linked_data

    不需要额外的步骤。

        2
  •  0
  •   Progman    8 年前

    Main 表,并让AUTO\u INCREMENT列生成新行的Id(正如它应该的那样)。对于每一行,在关联数组中缓存生成的Id,关联数组将旧Id映射到新生成的Id。

    然后插入 linked 桌子。在添加新行之前,根据创建的关联数组将旧外键Id替换为新生成的Id。

    推荐文章