【问题标题】:How do I insert the value of an auto-increment ID column into another column on inserting into MySQL table?如何在插入 MySQL 表时将自动增量 ID 列的值插入另一列?
【发布时间】:2012-08-14 10:00:00
【问题描述】:

我的 MySQL 表中的第一列包含一个自动增量 ID。我想在向表中插入新行时将此值输入另一列,即我需要读取 ID 列中的值并将其插入下一列。

是否有可能做到这一点,如果可以,怎么做?

【问题讨论】:

    标签: mysql insert auto-increment


    【解决方案1】:

    这应该有效:

    INSERT INTO table(id, same_id, col1)
    (
     SELECT NULL AS id,
            (SELECT AUTO_INCREMENT
             FROM information_schema.TABLES
             WHERE TABLE_SCHEMA=DATABASE() AND
                   TABLE_NAME='table') AS same_id,
            "value" AS col1
    );
    

    编辑:正如Jonathan Swartz 所指出的,它确实受到竞争条件的影响。 要解决此问题,请使用 LAST_INSERT_ID() 获取最后插入的 id 并在新列中更新此值:

    INSERT INTO table(id, same_id, col1)
    (
     SELECT NULL AS id,
            NULL AS same_id,
            "value" AS col1
    );
    
    SELECT LAST_INSERT_ID() INTO @var_id;
    
    UPDATE  table
    SET     same_id = @var_id
    WHERE   id = @var_id;
    

    【讨论】:

    • 这里是否存在竞争条件的危险——比如 auto_increment 在被选中和插入提交之间发生变化(因为单独的插入)?
    • 确认它确实受到竞争条件的影响。您可以通过插入 sleep(3) 作为值来查看这一点,然后在单独的 mysql shell 中进行另一个插入。您将在两行中获得相同的 same_id 值。
    • @JonathanSwartz 是的。我已经编辑了解决此问题的答案。
    【解决方案2】:

    一个简单的触发器就可以完成这项工作。

    在表1中插入行时会调用它

    并将从中获取 Id 并将文件插入到表 2 中

    check manual

    【讨论】:

      【解决方案3】:

      我确信上述一些答案有效,但我无法弄清楚如何实施它们。然而,我确实使用$pdo->lastInsertId() 成功实现了一个解决方案,即在执行我的 INSERT 查询后,我添加了:

      $new_id = $pdo->lastInsertId();
      
      $sth2 = $pdo->prepare("UPDATE `tracks` SET `fav_id`= IF(`fav_id`=0,$new_id,fav_id) WHERE `id`=$new_id");
      $sth2->execute();
      

      如果 fav_id 尚未设置,这会将最后插入的行的 fav_id 列设置为与该行的 id 列相同的值。

      【讨论】:

        【解决方案4】:

        如果您在此使用PHP,则可以使用mysqli_insert_id

        示例。

        <?php
        $mysqli = new mysqli("localhost", "my_user", "my_password", "world");
        
        /* check connection */
        if (mysqli_connect_errno()) {
            printf("Connect failed: %s\n", mysqli_connect_error());
            exit();
        }
        
        $mysqli->query("CREATE TABLE myCity LIKE City");
        
        $query = "INSERT INTO myCity VALUES (NULL, 'Stuttgart', 'DEU', 'Stuttgart', 617000)";
        $mysqli->query($query);
        
        printf ("New Record has id %d.\n", $mysqli->insert_id);
        
        /* drop table */
        $mysqli->query("DROP TABLE myCity");
        
        /* close connection */
        $mysqli->close();
        ?>
        

        mysqli_insert_id() 函数返回由对具有 AUTO_INCREMENT 属性的列的表的查询生成的 ID。如果最后一个查询不是 INSERT 或 UPDATE 语句,或者修改后的表没有具有 AUTO_INCREMENT 属性的列,则此函数将返回零。

        【讨论】:

        • 是的,我正在使用 PHP 来处理 MySQL 插入。从你的例子中我不清楚我在哪里包含 mysqli_insert_id。大概是在 INSERT 查询之后?我无法从您的回答中看出哪一行处理将列 ID 插入到列 ID2 中。
        • 我在 INSERT 查询后使用$id = mysqli_insert_id($sql); $sql2="UPDATE tracks SET fav_id='$id' WHERE id='$id'";,但 fav_id 仍然设置为 0。
        【解决方案5】:

        您也可以使第二列自动递增(使用匹配的 AUTOINCREMENT 初始值),有或没有任何键。

        【讨论】:

        • mysql 中的同一张表不能有多个自增列。
        猜你喜欢
        • 1970-01-01
        • 2019-05-16
        • 2012-11-13
        • 2015-04-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-24
        • 2016-03-21
        相关资源
        最近更新 更多