MySQL存储过程 - 如何获取最后插入的ID

3
我已经创建了一个存储过程,它会将记录插入到表中,并获取该记录的自增ID。然而,在将LAST_INSERT_ID()赋值给一个变量时,我遇到了语法错误。

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ');
SET _orderId = SELECT LAST_INSERT_ID(); END' at line 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个回答

3

试试这个。

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 ;

或者

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 ;

我已经更新了答案。希望这是你要找的。 - Rohit.007
你会在Procedure中再次使用那个变量吗?还是你会在你的Model中使用它?否则,你也可以使用它作为SELECT LAST_INSERT_ID() AS "_orderId"。 - Rohit.007
我已添加了第二个查询,这可能会对你有所帮助。你可以在模型中获取结果,并将其返回到“_orderId”列中,然后可以在同一事务中重复使用它。 - Rohit.007
错误 1064 (42000):您的 SQL 语法有误;请检查与您的 MySQL 服务器版本相对应的手册,以获取正确的语法使用方式,位于第 7 行的 '); SELECT LAST_INSERT_ID() AS '_orderId '; END'。 - rahul shalgar
你的查询中有一个额外的闭合括号。 - Rohit.007
显示剩余4条评论

1
你应该确保你的应用程序没有全局连接或共享连接。因为last_insert_id()将返回最后生成的AI值,它可以来自任何表。特别是如果你的主机应用程序正在使用异步任务。
考虑以下场景:
1.你的应用程序每秒保存一次GPS位置=>生成新的AI值
2.你尝试上面的SP插入一个值=>生成新的AI值
3.在插入和读取last_insert_id之间,你的应用程序再次记录GPS位置并创建了新的AI值。
4.现在猜猜会发生什么?你会从GPS表而不是你的SP中获取最后插入的ID。
通常插入速度很快,但假设你的SP必须等待表锁定并且被延迟。在这种情况下,你将收到错误的ID。
最安全的方法可能是将你的SP工作封装在一个事务中,并获取你的AI列的最大值(假设它是一个无符号的AI列)。

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;
...

@rahulshalgar:请查看dbfiddle - wchiquito

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接