MySQL 使用存储过程中最后插入的 id

Posted

技术标签:

【中文标题】MySQL 使用存储过程中最后插入的 id【英文标题】:MySQL Use last inserted id from stored procedure 【发布时间】:2021-02-07 19:46:13 【问题描述】:

通过phpmyadmin的界面,我创建了一个存储过程如下:

DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_checkin_create`(IN `userid` INT(10), IN `organizationid` INT(10), IN `checkindate` DATETIME(6), IN `checkoutdate` DATETIME(6), IN `checkinid` INT(10))
NO SQL
Insert Into checkin Values(CheckInID, UserID, OrganizationID, CheckInDate, CheckOutDate) ON DUPLICATE 
KEY UPDATE CheckInID=CheckInID, UserID=userid, OrganizationID=organizationid, checkindate=checkindate, CheckOutDate=checkoutdate$$
DELIMITER ;

如何从这个过程中返回LAST_INSERT_ID()?我知道以下用例:

SELECT LAST_INSERTED_ID();

但我无法找到一种方法在过程中组合此查询而不会出现模棱两可的错误。

任何帮助将不胜感激。

编辑 1

创建表语句:

DROP TABLE IF EXISTS `checkin`;
CREATE TABLE IF NOT EXISTS `checkin` (
`CheckInID` int(11) NOT NULL AUTO_INCREMENT,
`UserID` int(11) NOT NULL,
`OrganizationID` int(11) DEFAULT NULL,
`CheckInDate` datetime DEFAULT NULL,
`CheckOutDate` datetime(6) NOT NULL,
PRIMARY KEY (`CheckInID`),
UNIQUE KEY `CheckInID` (`CheckInID`)
) ENGINE=MyISAM AUTO_INCREMENT=4407 DEFAULT CHARSET=latin1;

【问题讨论】:

显示 checkin 表的完整 CREATE TABLE 脚本。什么约束可能导致 ODKU 动作? @Akina 检查编辑 1) 如果存在 PK 约束,则相同表达式的唯一键是多余的。您将有两个相似的索引。删除 UNIQUE KEY `CheckInID` (`CheckInID`) 行。 2) 如果 ODKU 因现有转移的CheckInID 值而被触发,则其分配过多。 【参考方案1】:

正式地:

DELIMITER $$

CREATE 
DEFINER=`root`@`localhost` 
PROCEDURE `sp_checkin_create` ( IN `userid` INT(10), 
                                IN `organizationid` INT(10), 
                                IN `checkindate` DATETIME(6), 
                                IN `checkoutdate` DATETIME(6), 
                                IN `checkinid` INT(10),
                                OUT inserted_id BIGINT )
NO SQL
BEGIN
    Insert Into checkin 
        Values (CheckInID, UserID, OrganizationID, CheckInDate, CheckOutDate) 
        ON DUPLICATE KEY UPDATE 
        UserID=userid, OrganizationID=organizationid, checkindate=checkindate, CheckOutDate=checkoutdate;
    SELECT LAST_INSERT_ID() INTO inserted_id;
END;
$$

DELIMITER ;

CALL sp_checkin_create(123, 456, '2021-01-01', '2021-01-01', 789, @last_inserted_id);
SELECT @last_inserted_id;

真的:LAST_INSERT_ID() 仅在自动增量生成新值时使用 - 因此在这两种情况下都没有意义(插入的新行都使用 AI 显式分配和触发 ODKU)。

【讨论】:

以上是关于MySQL 使用存储过程中最后插入的 id的主要内容,如果未能解决你的问题,请参考以下文章

MySQL - 带有更新和插入的过程中最后一次选择的输出

mysql 存储过程 若主键冲突则更新,不冲突则插入数据

MySQL存储过程从列表中插入多行

MySQL 过程将空结果返回给 PHP

mysql存储过程实现数据查询与插入

mysql在未插入的存储过程中插入语句