mysql存储过程-如何获取最后一个插入id

mysql存储过程-如何获取最后一个插入id,mysql,stored-procedures,Mysql,Stored Procedures,我创建了一个存储过程,它将一条记录插入到表中并获取该记录的自动递增ID。。。在这里,我在将LAST_INSERT_ID设置到变量中时遇到语法错误 错误1064 42000:您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以了解使用near'的正确语法; SET _orderId=选择最后一个插入ID; 在第5行结束 请帮我解决这个问题。。。先谢谢你 我的代码如下所示 delimiter // CREATE PROCEDURE placeOrder(IN _cartId

我创建了一个存储过程,它将一条记录插入到表中并获取该记录的自动递增ID。。。在这里,我在将LAST_INSERT_ID设置到变量中时遇到语法错误

错误1064 42000:您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以了解使用near'的正确语法; SET _orderId=选择最后一个插入ID; 在第5行结束

请帮我解决这个问题。。。先谢谢你

我的代码如下所示

delimiter //

    CREATE PROCEDURE placeOrder(IN _cartId INT,IN _createdBy INT)
    BEGIN

    DECLARE _orderId INT;

    -- insert into order
    INSERT INTO `TBL_ORDER`(`DealerId`, `OrderNo`, `CreatedBy`) VALUES ((SELECT DealerId FROM TBL_SHOPPING_CART WHERE Id =  _cartId),UNIX_TIMESTAMP(),_createdBy)); 
    SET _orderId = SELECT LAST_INSERT_ID();

    END//

    delimiter ;
尝试:

... -SET _orderId=选择最后一个插入ID; 设置_orderId=最后一次插入_ID; 选择_orderId; ... 或

... -SET _orderId=选择最后一个插入ID; SET _orderId=选择最后一个插入ID; 选择_orderId; ... 试试这个

delimiter //
CREATE PROCEDURE placeOrder(IN _cartId INT,IN _createdBy INT)
BEGIN
SET @orderId = '';
-- insert into order
INSERT INTO `TBL_ORDER`(`DealerId`, `OrderNo`, `CreatedBy`) VALUES ((SELECT DealerId FROM TBL_SHOPPING_CART WHERE Id =  _cartId),UNIX_TIMESTAMP(),_createdBy)); 

SELECT LAST_INSERT_ID() INTO @orderId;


END//

delimiter ;


您应该确保您的应用程序没有全局连接或共享连接。最后插入时,它将返回最后生成的AI值,该值可以来自任何表。尤其是当主机应用程序使用异步任务时

考虑以下场景

应用程序每秒保存gps位置=>生成新的AI值 您正在尝试在SP上方插入一个值=>生成新的AI值 在插入和读取上次插入id之间,应用程序将再次记录gps位置并创建新的AI值。 现在猜猜会发生什么?您从gps表而不是SP获取最后插入的id。 通常insert很快,但假设您的SP必须等待表锁并被延迟。在这种情况下,您将收到错误的ID


最安全的方法是在事务中逃避SP工作,并获取AI列的最大值(假设它是未签名的AI列)。

@rahulshalgar:请参阅。我已更新了答案。希望这就是你们想要的。你们会在程序中再次使用那个变量,还是在你们的模型中使用它?否则,您也可以将其用作SELECT LAST_INSERT_ID as _orderId您能解释一下您想要对结果做什么吗?在做了一些计算之后,我想更新同一事务中的特定记录…我添加了第二个查询,这可能会对您有所帮助。您可以在模型中获取结果,它将最后插入的ID返回到_orderId列中,然后您可以在同一事务中重用它。
delimiter //
    CREATE PROCEDURE placeOrder(IN _cartId INT,IN _createdBy INT)
    BEGIN

    -- insert into order
    INSERT INTO `TBL_ORDER`(`DealerId`, `OrderNo`, `CreatedBy`) VALUES ((SELECT DealerId FROM TBL_SHOPPING_CART WHERE Id =  _cartId),UNIX_TIMESTAMP(),_createdBy); 

SELECT LAST_INSERT_ID() AS '_orderId ';


END//

delimiter ;