Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysql过程中的最后一个\u insert\u id()返回0_Mysql_Stored Procedures - Fatal编程技术网

mysql过程中的最后一个\u insert\u id()返回0

mysql过程中的最后一个\u insert\u id()返回0,mysql,stored-procedures,Mysql,Stored Procedures,我使用过程插入或更新表中的数据,并希望返回上次插入的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 IN

我使用过程插入或更新表中的数据,并希望返回上次插入的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-debugdebug\u-output-VALUES-lastID-只是为了验证最后一个\u-INSERT\u-ID返回的值是否为0。我知道,在更新的情况下,最后一个插入ID是没有意义的,这很好。但即使插入新记录,我仍然得到0

有没有办法解决这个问题


谢谢,zbynek

假设插入一个ID值-1将生成一个新ID,这是错误的。要么在ID列签名时插入一个值为-1的新行,要么出现如下错误

错误1264 22003:第1行列“id”的值超出范围

当您的ID列未签名时

更新行时,上一个\u INSERT \u ID始终为0,因为必须将ON DUPLICATE KEY子句修改为:

...
ON DUPLICATE KEY UPDATE 
ID = LAST_INSERT_ID(ID),
Name=VALUES(Name),
...
但是请注意,如果insert与现有行匹配,则它也将为0,但没有任何内容需要更新,例如,列名的值为Peter,您希望为每个列使用值Peter进行更新,反之亦然


它总是0,因为您总是为auto_increment列指定一个值。

在这种情况下,您确定MySQL自动生成任何id吗?看起来你是在自己插入ID我不这么认为-我插入的ID要么是-1,在这种情况下,插入一个自动生成ID的新行,要么是某个值>0,它总是重复的,因此该行将被更新确定,谢谢。我更改了过程,因此现在它包含if-else条件来决定是更新值还是插入新行,并且返回的最后一个插入id现在是正确的。