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

时间:2018-05-12 09:38:06

标签: mysql stored-procedures

我创建了一个存储过程,将记录插入表格和表格中。获取该记录的自动递增ID ...这里我在将LAST_INSERT_ID()设置为变量时出现语法错误...

错误1064(42000):您的SQL语法出错;检查与MySQL服务器版本对应的手册,以便在')附近使用正确的语法; SET _orderId = SELECT LAST_INSERT_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 ;

3 个答案:

答案 0 :(得分:1)

试试这个。

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 ;

OR

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 ;

答案 1 :(得分:0)

尝试:

...
-- SET _orderId = SELECT LAST_INSERT_ID();
SET _orderId = LAST_INSERT_ID();
SELECT _orderId;
...

...
-- SET _orderId = SELECT LAST_INSERT_ID();
SET _orderId = (SELECT LAST_INSERT_ID());
SELECT _orderId;
...

答案 2 :(得分:0)

您应确保您的应用程序没有全局连接或共享连接。当last_insert_it()将返回上次生成的AI值时,它可以来自任何表格。特别是如果您的主机应用程序使用异步TASK

Concider以下场景

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

    最安全的方法是在交易中对您的SP工作进行封装。获取AI列的最大值(假设它是一个未签名的AI列)。