从mysql插入查询中获取新记录主键ID?

Amy*_*lle 216 mysql key insert auto-increment

好的,所以我可以说我在INSERT我的一个表中做了一个mysql ,而且表中有一个item_id设置为autoincrement和的列primary key.

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

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

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

Dun*_*ock 288

您需要使用以下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();
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 这将使你返回*you*插入的最后一行的'PRIMARY KEY`值,因为它是每个连接 - 每个到服务器的连接都将保持它自己的值.我已经更新了答案以澄清这一点. (21认同)
  • 是但是如果在过渡期间(在进程列表中的查询之间)插入了其他一行呢?有没有办法编写插入查询,以便输出? (8认同)

Mar*_*OEE 20

谨防 !! 如果尝试在PHP中返回此主键值,则为"LAST_INSERT_ID()".

我知道这个帖子没有被标记为php,但是对于任何遇到这个答案的人来说,希望使用标准的mysql_query调用从PHP脚本插件返回一个MySQL插入ID - 它不会工作,并且不会在没有捕获SQL错误的情况下显而易见.

较新的mysqli支持多个查询 - 其中 LAST_INSERT_ID()实际上是来自原始查询的第二个查询.

IMO单独的SELECT用于标识最后一个主键比可选的mysql_insert_id()函数更安全,该函数返回从先前的INSERT操作生成的AUTO_INCREMENT ID.

  • `LAST_INSERT_ID`是一个每连接的MySQL函数.如果查询最后一个插入ID,则可能会有一个单独的连接执行写入,并且您将使用错误的ID. (5认同)
  • 当你留下“它不起作用”时,你能澄清你的意思吗? (2认同)

Ula*_*lau 20

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

START TRANSACTION;
  INSERT INTO dog (name, created_by, updated_by) VALUES ('name', 'migration', 'migration');
  SELECT LAST_INSERT_ID();
COMMIT;
Run Code Online (Sandbox Code Playgroud)

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

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


Exp*_*lls 16

LAST_INSERT_ID()文档:

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

也就是说,如果您同时对脚本提出两个单独的请求,则它们不会影响彼此LAST_INSERT_ID()(除非您使用的是持久连接).

  • 我认为如果您的表上具有向另一个表中插入的触发器,这是可疑的。...LAST_INSERT_ID()将返回另一个表的ID值。 (2认同)

PVR*_*PVR 14

在这里你要找的!!!

select LAST_INSERT_ID()
Run Code Online (Sandbox Code Playgroud)

这是SCOPE_IDENTITY()使用函数的最佳选择SQL Server.

您还需要记住,这只有Last_INSERT_ID()在您的Insert查询后触发时才会起作用.即查询返回模式中插入的id.您无法获取特定表的最后插入ID.

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


Cur*_*wer 13

只需使用:

$last_id = mysqli_insert_id($conn);
Run Code Online (Sandbox Code Playgroud)

  • 实际上,感谢谷歌,我在这里偶然发现了这个答案的 php 版本,所以我投票支持了这个答案。虽然从技术上讲,OP 并不要求 php,但这对很多在这里绊倒的人来说可能会有帮助。 (4认同)

MES*_*ehr 11

您将在查询结果中收到以下参数:

    "fieldCount": 0,
    "affectedRows": 1,
    "insertId": 66,
    "serverStatus": 2,
    "warningCount": 1,
    "message": "",
    "protocol41": true,
    "changedRows": 0
Run Code Online (Sandbox Code Playgroud)

insertId正是您所需要的。

(NodeJS-mySql)


moj*_*ken 10

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

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

  • 伙计,你的这篇评论值得一枚奖章。这篇文章是今天发生的最好的事情。 (4认同)

小智 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
Run Code Online (Sandbox Code Playgroud)

您可以在插入中使用它:

INSERT INTO
    document (Code, Title, Body)
VALUES (                
    sha1( concat (convert ( now() , char), ' ',   getAutoincrementalNextval ('document') ) ),
    'Title',
    'Body'
);
Run Code Online (Sandbox Code Playgroud)

  • 这似乎不是一个好主意?如果 2 个客户端同时调用该函数,他们会认为他们正在插入相同的 id,但实际上并非如此......插入时会稍微慢一些,并在不知情的情况下获取下一个 ID。 (5认同)