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

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

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

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


当前回答

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

Eg:

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

这将得到你插入的最后一行的PRIMARY KEY值:

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

因此LAST_INSERT_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'
);

这就是你要找的东西!!

select LAST_INSERT_ID()

这是在SQL Server中使用SCOPE_IDENTITY()函数的最佳替代方案。

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

有关更多细节,请通过链接SQLServer函数SCOPE_IDENTITY()在mySQL?

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

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

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

我真的不建议你这样做,除非你没有其他选择。

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

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

insertId正是您所需要的。

(NodeJS-mySql)

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

否则,使用LAST_INSERT_ID可以得到这样的值:SELECT LAST_INSERT_ID();