假设我正在对我的一个表进行MySQL INSERT操作,该表有列item_id,它被设置为自动递增和主键。

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

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

如果这是不可能的,那么什么是最佳实践,以确保我检索正确的id?


当前回答

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

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'
);

其他回答

你需要对事务使用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

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

小心! !如果试图在PHP中返回这个主键值,则返回LAST_INSERT_ID()。

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

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

在我看来,一个单独的SELECT来标识最后一个主键比可选的mysql_insert_id()函数更安全,该函数返回由前面的INSERT操作生成的AUTO_INCREMENT ID。

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

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

insertId正是您所需要的。

(NodeJS-mySql)

从LAST_INSERT_ID()文档:

生成的ID在服务器中以每个连接为基础进行维护

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

这样做:

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

在$idc上,您将获得最后一个id