mysql有 LAST_INSERT_ID(); 获取最后一次插入的函数。但这并不安全:如果我运行一些查询,那么 LAST_INSERT_ID() 在两者之间执行另一个查询时,我可能会得到错误的id。这可能发生在使用同一连接的多个线程中,或者使用pconnect(多用户的持久连接)有没有安全的方法来获得我想要的100%的id?谢谢
LAST_INSERT_ID();
LAST_INSERT_ID()
8e2ybdfx1#
在以下情况下,存储程序可能会有所帮助:
Create table test (id int AUTO_INCREMENT primary key, name varchar(50) )
存储过程为:
delimiter $$DROP PROCEDURE IF EXISTS InserData$$CREATE PROCEDURE InserData(IN _Name VARCHAR(50))BEGIN START TRANSACTION; INSERT INTO test(name) VALUES (_Name); SELECT LAST_INSERT_ID() AS InsertID; COMMIT;END
delimiter $$
DROP PROCEDURE IF EXISTS InserData$$
CREATE PROCEDURE InserData(IN _Name VARCHAR(50))
BEGIN
START TRANSACTION;
INSERT INTO test(name) VALUES (_Name);
SELECT LAST_INSERT_ID() AS InsertID;
COMMIT;
END
使用调用存储过程
CALL InserData('TESTER')
尝试一下,因为我们有事务语句,但它不能确保在多线程环境中的价值。最后一个插入id的链接mysql线程安全性解释了它将基于每个连接模型工作。
ibrsph3r2#
使用select max(id)from table是否比使用select last\u insert\u id()更安全,后者作为两个独立的查询运行?根据您的问题,表必须有一个主键。所以你可以从max(id)那里得到最后一条记录
2条答案
按热度按时间8e2ybdfx1#
在以下情况下,存储程序可能会有所帮助:
存储过程为:
使用调用存储过程
尝试一下,因为我们有事务语句,但它不能确保在多线程环境中的价值。
最后一个插入id的链接mysql线程安全性解释了它将基于每个连接模型工作。
ibrsph3r2#
使用select max(id)from table是否比使用select last\u insert\u id()更安全,后者作为两个独立的查询运行?根据您的问题,表必须有一个主键。所以你可以从max(id)那里得到最后一条记录