344

假设我正在INSERT对我的一张表执行 MySQL,并且该表的列item_id设置为autoincrementand primary key

如何让查询item_id在同一个查询中输出新生成的主键的值?

目前我正在运行第二个查询来检索 id 但这似乎不是一个好的做法,因为这可能会产生错误的结果......

如果这是不可能的,那么确保我检索到正确 ID 的最佳做法是什么?

4

13 回答 13

446

您需要使用该LAST_INSERT_ID()功能:http ://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id

例如:

INSERT INTO table_name (col1, col2,...) VALUES ('val1', 'val2'...);
SELECT LAST_INSERT_ID();

这将使您返回插入PRIMARY KEY的最后一行的值:

生成的 ID 在每个连接的基础上在服务器中维护。这意味着函数返回给给定客户端的值是为影响该客户端的 AUTO_INCREMENT 列的最新语句生成的第一个 AUTO_INCREMENT 值。

因此返回的值LAST_INSERT_ID()是每个用户的,不受其他用户可能在服务器上运行的其他查询的影响。

于 2013-06-14T16:16:53.060 回答
34

谨防 !!如果试图在 PHP中LAST_INSERT_ID() 返回这个主键值。

我知道这个线程没有标记 PHP,但是对于遇到这个答案的任何人来说,希望使用标准mysql_query调用从 PHP 脚本插入返回 MySQL 插入 id - 如果不捕获 SQL 错误,它不会工作并且不明显。

较新的mysqli支持多个查询 -LAST_INSERT_ID()实际上是原始查询的第二个查询。

IMO 单独SELECT识别最后一个主键比返回从先前操作生成的可选mysql_insert_id()函数更安全。AUTO_INCREMENT IDINSERT

于 2014-08-06T21:56:47.450 回答
22

LAST_INSERT_ID()文档中:

生成的 ID 在每个连接的基础上维护在服务器中

也就是说,如果您同时对脚本有两个单独的请求,它们不会相互影响LAST_INSERT_ID()(除非您可能正在使用持久连接)。

于 2013-06-14T16:27:23.953 回答
20

这就是你要找的东西!!!

select LAST_INSERT_ID()

这是SCOPE_IDENTITY()SQL Server.

您还需要记住,这仅在您的查询Last_INSERT_ID()之后触发时才有效。Insert那就是查询返回插入到模式中的 id。您无法获取特定表的最后插入 id。

有关更多详细信息,请通过链接MySQL 中 SQLServer 函数 SCOPE_IDENTITY() 的等效项?

于 2013-06-14T16:27:55.793 回答
15

您将在查询结果中收到这些参数:

    "fieldCount": 0,
    "affectedRows": 1,
    "insertId": 66,
    "serverStatus": 2,
    "warningCount": 1,
    "message": "",
    "protocol41": true,
    "changedRows": 0

insertId正是您所需要的。

(NodeJS-mySql)

于 2018-05-31T02:21:08.690 回答
14

如果在 python 中使用pymysql,则可以从光标中使用cursor.lastrowid.

它是 DB API 标准中的文档化扩展PEP-249,也适用于其他 Python MySQL 实现。

于 2019-04-03T21:30:42.770 回答
7

您需要将 LAST_INSERT_ID() 函数与事务一起使用:

START TRANSACTION;
  INSERT INTO dog (name, created_by, updated_by) VALUES ('name', 'migration', 'migration');
  SELECT LAST_INSERT_ID();
COMMIT;

http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id

此函数将返回表中最后插入的主键。

于 2020-09-10T15:26:14.230 回答
6

如果在插入行之前需要该值:

CREATE FUNCTION `getAutoincrementalNextVal`(`TableName` VARCHAR(50))
    RETURNS BIGINT
    LANGUAGE SQL
    NOT DETERMINISTIC
    CONTAINS SQL
    SQL SECURITY DEFINER
    COMMENT ''
BEGIN

    DECLARE Value BIGINT;

    SELECT
        AUTO_INCREMENT INTO Value
    FROM
        information_schema.tables
    WHERE
        table_name = TableName AND
        table_schema = DATABASE();

    RETURN Value;

END

您可以在插入中使用它:

INSERT INTO
    document (Code, Title, Body)
VALUES (                
    sha1( concat (convert ( now() , char), ' ',   getAutoincrementalNextval ('document') ) ),
    'Title',
    'Body'
);
于 2016-10-27T09:42:18.117 回答
4

如果您使用的是 PHP:在PDO对象上,您可以在插入后简单地调用 lastInsertId方法。

否则,使用LAST_INSERT_ID您可以获得如下值:SELECT LAST_INSERT_ID();

于 2019-01-18T23:48:07.617 回答
3

只需使用“$last_id = mysqli_insert_id($conn);”

于 2018-07-15T09:38:36.163 回答
2

我用于return $this->db->insert_id();Codeigniter

于 2019-08-20T12:23:42.063 回答
0

做这个:

$idc = DB::table('tb_clients')->insertGetId([
                'ide'                   => $ide,
                'nome'                  => $nome,
                'email'                 => $email 
            ]);

在 $idc 你会得到最后一个 id

于 2021-06-10T12:54:24.180 回答
-2

我只是想在 PHP 中分享我的方法,你们中的一些人可能会发现它不是一种有效的方法,但这比其他可用选项好 100 倍。

生成一个随机键并将其插入到创建新行的表中。然后您可以使用该键来检索主键。使用更新来添加数据和做其他事情。

这样做有助于保护一行并拥有正确的主键。

我真的不推荐这个,除非你没有其他选择。

于 2020-05-12T09:36:47.487 回答