从MySQL插入查询获得新的记录主键ID ?

让我们说我正在做一个MySQL INSERT到我的一个表和表的列item_id设置为autoincrementprimary key

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

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

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

426964 次浏览

你需要使用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()返回的值是每个用户的,并且可能在服务器来自其他用户上运行的其他查询返回的值是不受影响

LAST_INSERT_ID()文档中:

生成的ID在服务器的为基础上维护

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

这就是你要找的东西!!

select LAST_INSERT_ID()

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

你还需要记住,只有当你的Insert查询触发Last_INSERT_ID()时,这才会工作。 即查询返回插入到模式中的id。无法获取特定表的最后插入id。< / p >

欲了解更多详细信息,请访问链接等同于SQLServer函数SCOPE_IDENTITY()在mySQL?

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

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

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

在IMO中,一个单独的SELECT来标识最后一个主键比可选的mysql_insert_id()函数更安全,该函数返回由前一个INSERT操作生成的AUTO_INCREMENT 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'
);

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

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

insertId正是你所需要的。

(NodeJS-mySql)

简单的使用方法:

$last_id = mysqli_insert_id($conn);
如果你正在使用PHP:在PDO对象上,你可以简单地调用

. lastInsertId方法

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

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

它是一个PEP-249中记录扩展 DB API标准,也适用于其他Python MySQL实现。

我使用return $this->db->insert_id();作为Codeigniter

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

生成一个随机键并将其插入到表中创建一个新行。 然后可以使用该键来检索主键。

.使用更新来添加数据和做其他事情

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

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

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

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

这样做:

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

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