mysql - MySQL 使用存储过程中最后插入的 id
问题描述
通过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;
解决方案
正式地:
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)。
推荐阅读
- multithreading - Discord.py 处理多个用户的多个会话
- cuda - 如何在 Google.colab 上运行 .cu 文件?
- css - 在 SCSS 中将十六进制字符串转换为十六进制颜色值
- breakpoints - 当前不会命中断点(仅在视图中)
- php - 在 edit_customer.blade.php 文件中获取数据
- python - 如何比较 html 中的 datetimepicker 表单的日期和 python 中的另一个日期
- delphi - Delphi 字符串排序
- docker - 为什么 docker swarm 使用秘密路径而不是秘密值?
- flutter - 在flutter中使用firebase动态链接导航到特定的firestore页面
- javascript - 如何在 vanilla js/ts (Angular) 中重启动画并支持 IOS