【问题标题】:Duplicate MySQL Parent Child records重复的 MySQL 父子记录
【发布时间】:2013-10-08 23:16:30
【问题描述】:

我有一个 MySQL 表:

  • 身份证
  • 姓名
  • parent_id
  • 版本

parent_id 是同一张表中 id 的外键。

我想将版本 = 1 的所有记录复制到版本 = 2,同时保留父/子结构。

当我使用这个查询时:

INSERT INTO 
    table 
    (
        name,
        parent_id,
        version
    )
SELECT
    name,
    parent_id,
    2
FROM 
    table
WHERE 
    version = 1

新记录(当然)成为旧记录的子记录...那么,如何将 parent_id 设置为新创建的记录?

【问题讨论】:

  • children 是正确的术语。
  • 如果 parent_id 必须在“level 1”记录中存储新的“level 2”记录的 id 值,我会使用带有游标的过程。请确认具体要求...

标签: mysql


【解决方案1】:

您可以尝试制定映射策略,找出新 ID 是什么并映射回它们,或者您可以简单地将新 ID 偏移一定数量:

INSERT INTO `table` (id, name, parent_id, version)
  SELECT id+10000, name, parent_id+10000, 2
  FROM `table`
  WHERE version=1

在这种情况下,10000 将大于该表中的SELECT MAX(id)。如果您锁定表、计算最大值并进行插入,则可以将其编写为单个语句。 4

【讨论】:

    【解决方案2】:

    试试这个:

    INSERT INTO 
        table 
        (
            name,
            parent_id,
            version
        )
    SELECT
        name,
        id,
        2
    FROM 
        table
    WHERE 
        version = 1
    

    【讨论】:

    • 使用{}按钮格式化代码,或缩进四个空格。
    • 这和问题中的不完全一样吗?
    • 我只是将 parent_id 替换为 id,因为他想将其与 parent 的 id 链接。感谢您格式化代码。我还是新来的……
    • 没关系。不过,我仍然认为你错过了问题的重点。如果您从批量插入开始,这是一件非常重要的事情,因为您仍然需要将旧的 parent_id 值重新映射到新的 parent_id 值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-01
    • 2014-03-18
    • 2013-07-18
    • 1970-01-01
    • 1970-01-01
    • 2013-01-11
    相关资源
    最近更新 更多