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