last_insert_id() 在 mysql 过程中 returns 0
last_insert_id() inside mysql procedure returns 0
我使用程序在 table 中插入或更新数据,我希望返回最后插入的 ID。
这是我的程序:
/* insert or update task */
DROP PROCEDURE IF EXISTS `proc_update_task`;
DELIMITER $$
CREATE PROCEDURE `proc_update_task`(IN TaskID INT, IN Name VARCHAR(100), IN Description TEXT, IN ProjectID INT, IN StatusID INT, IN ExpectedTime TIME, IN PriorityID INT, IN CategoryID INT, IN MilestoneID INT, IN UserID INT, IN DateDeadline DATE, OUT lastID INT)
BEGIN
DECLARE Status INT;
DECLARE Project INT;
DECLARE TimeExp DATE;
DECLARE Priority INT;
DECLARE Milestone INT;
DECLARE Category INT;
DECLARE User INT;
DECLARE Deadline DATE;
SET @Status = StatusID;
SET @Project = ProjectID;
SET @TimeExp = ExpectedTime;
SET @Priority = PriorityID;
SET @Milestone = MilestoneID;
SET @Category = CategoryID;
SET @User = UserID;
SET @Deadline = DateDeadline;
INSERT INTO tasks (ID, Name, Description, Project_ID, Status_ID, TimeExpected, Priority_ID, Category_ID, Milestone_ID, User_ID, DateDeadline)
VALUES (TaskID, Name, Description, @Project, @Status, @TimeExp, @Priority, @Category, @Milestone, @User, @Deadline)
ON DUPLICATE KEY UPDATE
Name=VALUES(Name), Description=VALUES(Description), Project_ID=@Project, Status_ID=@Status, TimeExpected=@TimeExp, Priority_ID=@Priority, Category_ID=@Category, Milestone_ID=@Milestone, User_ID=@User, DateDeadline=@Deadline;
SET lastID = LAST_INSERT_ID();
INSERT INTO debug(debug_output) VALUES (lastID);
END;
最后一位 - INSERT INTO debug(debug_output) VALUES (lastID)
- 只是为了验证 LAST_INSERT_ID()
返回的值确实是 0。我知道,LAST_INSERT_ID()
在更新的情况下是没有意义的,这很好。但是即使插入了新记录,我仍然得到0.
有什么解决办法吗?
谢谢,zbynek
您假设插入 -1
的 ID
值将生成一个新的 ID
,这是错误的。当 ID
列为 signed
时,会插入一个值为 -1
的新行,否则会出现类似
的错误
ERROR 1264 (22003): Out of range value for column 'id' at row 1
当您的 ID
列是 unsigned
。
您的 LAST_INSERT_ID
总是 0
当一行被更新时,因为您的 ON DUPLICATE KEY
子句必须修改为:
...
ON DUPLICATE KEY UPDATE
ID = LAST_INSERT_ID(ID),
Name=VALUES(Name),
...
(但请注意,如果插入与现有行匹配,它也将为 0,但没有要更新的内容,例如列 Name
具有值 Peter
并且你想用值 Peter
更新它(每列反之亦然))
它总是 0
因为您总是为 auto_increment
列指定一个值。
我使用程序在 table 中插入或更新数据,我希望返回最后插入的 ID。
这是我的程序:
/* insert or update task */
DROP PROCEDURE IF EXISTS `proc_update_task`;
DELIMITER $$
CREATE PROCEDURE `proc_update_task`(IN TaskID INT, IN Name VARCHAR(100), IN Description TEXT, IN ProjectID INT, IN StatusID INT, IN ExpectedTime TIME, IN PriorityID INT, IN CategoryID INT, IN MilestoneID INT, IN UserID INT, IN DateDeadline DATE, OUT lastID INT)
BEGIN
DECLARE Status INT;
DECLARE Project INT;
DECLARE TimeExp DATE;
DECLARE Priority INT;
DECLARE Milestone INT;
DECLARE Category INT;
DECLARE User INT;
DECLARE Deadline DATE;
SET @Status = StatusID;
SET @Project = ProjectID;
SET @TimeExp = ExpectedTime;
SET @Priority = PriorityID;
SET @Milestone = MilestoneID;
SET @Category = CategoryID;
SET @User = UserID;
SET @Deadline = DateDeadline;
INSERT INTO tasks (ID, Name, Description, Project_ID, Status_ID, TimeExpected, Priority_ID, Category_ID, Milestone_ID, User_ID, DateDeadline)
VALUES (TaskID, Name, Description, @Project, @Status, @TimeExp, @Priority, @Category, @Milestone, @User, @Deadline)
ON DUPLICATE KEY UPDATE
Name=VALUES(Name), Description=VALUES(Description), Project_ID=@Project, Status_ID=@Status, TimeExpected=@TimeExp, Priority_ID=@Priority, Category_ID=@Category, Milestone_ID=@Milestone, User_ID=@User, DateDeadline=@Deadline;
SET lastID = LAST_INSERT_ID();
INSERT INTO debug(debug_output) VALUES (lastID);
END;
最后一位 - INSERT INTO debug(debug_output) VALUES (lastID)
- 只是为了验证 LAST_INSERT_ID()
返回的值确实是 0。我知道,LAST_INSERT_ID()
在更新的情况下是没有意义的,这很好。但是即使插入了新记录,我仍然得到0.
有什么解决办法吗?
谢谢,zbynek
您假设插入 -1
的 ID
值将生成一个新的 ID
,这是错误的。当 ID
列为 signed
时,会插入一个值为 -1
的新行,否则会出现类似
ERROR 1264 (22003): Out of range value for column 'id' at row 1
当您的 ID
列是 unsigned
。
您的 LAST_INSERT_ID
总是 0
当一行被更新时,因为您的 ON DUPLICATE KEY
子句必须修改为:
...
ON DUPLICATE KEY UPDATE
ID = LAST_INSERT_ID(ID),
Name=VALUES(Name),
...
(但请注意,如果插入与现有行匹配,它也将为 0,但没有要更新的内容,例如列 Name
具有值 Peter
并且你想用值 Peter
更新它(每列反之亦然))
它总是 0
因为您总是为 auto_increment
列指定一个值。