最后一个INSERT ID SQL子查询返回多行

时间:2016-05-18 08:05:56

标签: mysql stored-procedures

我有以下存储过程:

DELIMITER $$
  DROP PROCEDURE IF EXISTS spCashDonation$$
  CREATE PROCEDURE spCashDonation(IN fname varchar(50),IN lname varchar(50),IN telNo bigint, IN pmode tinyint,IN amt decimal(8,2), OUT rno varchar(20))
    BEGIN
    Set @rmain := (select trim(concat('DNB', DATE_FORMAT(CURRENT_DATE(), '%y'), DATE_FORMAT(CURRENT_DATE(), '%m'))));

  IF ((trim(DATE_FORMAT(CURRENT_DATE(),'%m')) = 01) OR (trim(DATE_FORMAT(CURRENT_DATE(),'%m')) = 1)) THEN
    Set @rpart = 1;
 END IF;

 IF ((trim(DATE_FORMAT(CURRENT_DATE(),'%m')) != 01) OR (trim(DATE_FORMAT(CURRENT_DATE(),'%m')) != 1)) THEN
  Set @rpart := (select coalesce(max(ReceiptPart),0) from Donation) + 1;
 END IF;

 INSERT INTO Donation (ReceiptMain, ReceiptPart, firstName, lastName, telNo, payMode, Amount) VALUES (@rmain, @rpart, fname, lname, telNo, pmode, amt);

 Set @lid := (select LAST_INSERT_ID()from donation);
 select concat(ReceiptMain,ReceiptPart) into rno from donation where id = @lid;

 END$$
 DELIMITER ;

Call spCashDonation ('RAJIV','IYER',7506033048,0,1000,@rno);
select @rno;

当表没有记录时,第一次插入会很好。在第二个插入时,它会抛出错误

  

错误代码:1242。子查询返回的行数超过1行

当我查询最后一个插入ID时,我得到的值超过1。所以,我将程序的最后一部分修改为:

  

设置@lid:=(从捐赠中选择max(LAST_INSERT_ID());

请提供建议,如果这样可以,因为它不应该妨碍任何并发插入和未来的CRUD操作。提前谢谢。

1 个答案:

答案 0 :(得分:0)

Set @lid := (select LAST_INSERT_ID() from donation); 

在上面的行中删除FROM语句。如果捐赠表中有多条记录,则返回LAST_INSERT_ID()值的相同次数。

因此,只需使用Set @lid := (SELECT LAST_INSERT_ID());它就可以适用于您的情况。