【问题标题】:Retrieve id of each INSERT statement in multi query在多查询中检索每个 INSERT 语句的 id
【发布时间】:2016-10-13 09:48:30
【问题描述】:

是否可以在以下 SQL 请求中为每个 INSERT 语句检索 id(在我的情况下为 ua_id)

INSERT INTO users_addresses (ua_user_id, ua_address_id) VALUES (1,1);
INSERT INTO users_addresses (ua_user_id, ua_address_id) VALUES (1,2);
INSERT INTO users_addresses (ua_user_id, ua_address_id) VALUES (1,3);

使用mysqli::multi_query() 执行,其中ua_id 是AUTO_INCREMENT 主键?

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    在 MySQL 中,您可以使用 LAST_INSERT_ID() 函数。您每次都需要使用此函数 - 在 INSERT 语句之后。它获取最后插入的记录的 ID。

    MySQL 文档 - LAST_INSERT_ID()

    【讨论】:

    • 它倾向于只返回最后一个 INSERT 语句的 id,但不是全部。同样SELECT LAST_INSERT_ID() AS last_insert_id[1,2,..,n] 在每个 INSERT 之后也不起作用。
    • 此函数返回自动递增值的最后一个 ID。它必须在当前会话中执行 - 其中 INSERT 语句被调用。
    • 您能否提供一些示例代码,因为如果我这样形成它:INSERT INTO users_addresses (ua_user_id, ua_address_id) VALUES (1,1); SELECT LAST_INSERT_ID(); INSERT INTO users_addresses (ua_user_id, ua_address_id) VALUES (1,2); SELECT LAST_INSERT_ID(); 它似乎无法按预期工作。
    • 我添加了一个链接。有一个例子。
    【解决方案2】:

    嗯。你做一个多重查询,让我们使用它:

    <?php
    $db->multi_query('
    INSERT INTO users_addresses (ua_user_id, ua_address_id) VALUES (1,1);
    SELECT LAST_INSERT_ID();
    INSERT INTO users_addresses (ua_user_id, ua_address_id) VALUES (1,2);
    SELECT LAST_INSERT_ID();
    INSERT INTO users_addresses (ua_user_id, ua_address_id) VALUES (1,3);
    SELECT LAST_INSERT_ID()') or trigger_error($db->error);
    do {
       if ($result = $db->store_result()) {
          while ($row = $result->fetch_row()) {
              var_dump($row);
          }
       }
    } while ($db->next_result());
    

    【讨论】:

      【解决方案3】:

      你的意思是 lastInsertId 吗?

      http://cl1.php.net/manual/en/mysqli.insert-id.php

      希望对你有帮助!

      【讨论】:

        【解决方案4】:

        mysqli->insert_id 将返回插入的第一行的 ID,如果您在同一个表中插入,那么您就知道插入的下一行是第一行 insert_id + 1...

        如果您一次处理多个表,则需要回滚结果,然后您需要使用以下命令创建另一个查询:

        SELECT MAX(id) FROM table-a WHERE 1
        ...
        SELECT MAX(id) FROM table-n WHERE 1
        

        现在我不知道哪个更好(单插入查询或多查询)...

        【讨论】:

        • 这可能不太好 - 如果另一个用户与您同时插入怎么办?如果事务被回滚(在这种情况下序列中可能存在间隙)怎么办?
        【解决方案5】:

        是的。使用$mysqli-&gt;insert_id - 请参阅下面的工作示例。

        $mysqli = new mysqli(host, user, pass, db);
        
        $query  = "INSERT INTO users_addresses (ua_user_id, ua_address_id) VALUES (1,1); ";
        $query .= "INSERT INTO users_addresses (ua_user_id, ua_address_id) VALUES (1,2); ";
        $query .= "INSERT INTO users_addresses (ua_user_id, ua_address_id) VALUES (1,3); ";
        
        if ($mysqli->multi_query($query)) {
            do {
                /* Returns the auto generated id used in the last query */
                printf("%d\n", $mysqli->insert_id);
                /* Check if loop should continue */
                if ($mysqli->more_results() === FALSE) break;
            } while ($mysqli->next_result());
        }
        

        使用内置 mysqli::$insert_id - 文档:http://php.net/manual/en/mysqli.insert-id.php

        【讨论】:

          猜你喜欢
          • 2018-12-13
          • 1970-01-01
          • 2010-11-21
          • 2021-06-16
          • 2015-07-01
          • 2015-04-03
          • 1970-01-01
          • 2017-06-05
          • 2016-11-14
          相关资源
          最近更新 更多