假设我正在对我的一个表进行MySQL INSERT操作,该表有列item_id,它被设置为自动递增和主键。
如何让查询在同一查询中输出新生成的主键item_id的值?
目前,我正在运行第二个查询来检索id,但这似乎不是一个好的做法,考虑到这可能会产生错误的结果…
如果这是不可能的,那么什么是最佳实践,以确保我检索正确的id?
假设我正在对我的一个表进行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()返回的值是每个用户的,不受其他用户可能在服务器上运行的其他查询的影响。
其他回答
您需要使用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()返回的值是每个用户的,不受其他用户可能在服务器上运行的其他查询的影响。
我只是想分享我在PHP中的方法,有些人可能会发现这不是一个有效的方法,但这比其他可用的选项好100。
生成一个随机键并将其插入到表中,创建一个新行。 然后可以使用该键来检索主键。 使用更新来添加数据和做其他事情。
这样做有助于保护行并拥有正确的主键。
我真的不建议你这样做,除非你没有其他选择。
您将在查询结果中收到以下参数:
"fieldCount": 0,
"affectedRows": 1,
"insertId": 66,
"serverStatus": 2,
"warningCount": 1,
"message": "",
"protocol41": true,
"changedRows": 0
insertId正是您所需要的。
(NodeJS-mySql)
这样做:
$idc = DB::table('tb_clients')->insertGetId([
'ide' => $ide,
'nome' => $nome,
'email' => $email
]);
在$idc上,您将获得最后一个id
你需要对事务使用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
此函数将返回表中最后插入的主键。