| Bug #30895 | LAST_INSERT_ID() returning incorrect value | ||
|---|---|---|---|
| Submitted: | 7 Sep 2007 14:20 | Modified: | 23 Sep 2007 11:51 |
| Reporter: | Tanner Ratzlaff | Email Updates: | |
| Status: | Not a Bug | Impact on me: | |
| Category: | MySQL Server: General | Severity: | S2 (Serious) |
| Version: | 5.0.45 | OS: | Linux |
| Assigned to: | CPU Architecture: | Any | |
| Tags: | insert, LAST_INSERT_ID | ||
[7 Sep 2007 19:41]
Hartmut Holzgraefe
Can you also provide the definitions of the trigger and the BATCH table?
[7 Sep 2007 19:50]
Tanner Ratzlaff
CREATE TABLE `prep`.`BATCH` (
`ID` int(10) unsigned NOT NULL auto_increment,
`INSTITUTION_FKEY` int(10) unsigned NOT NULL,
`NAME` varchar(100) NOT NULL,
PRIMARY KEY (`ID`),
UNIQUE KEY `INSTITUTION_FKEY_2` (`INSTITUTION_FKEY`,`NAME`),
KEY `INSTITUTION_FKEY` (`INSTITUTION_FKEY`)
) ENGINE=InnoDB AUTO_INCREMENT=9021 DEFAULT CHARSET=latin1;
ENGINE=INNODB;
DROP TRIGGER IF EXISTS init_inst_bi;
delimiter //
CREATE TRIGGER init_inst_bi
BEFORE INSERT
ON prep.FILE_INFO
FOR EACH ROW
BEGIN
DECLARE CONTINUE HANDLER FOR 1329 SET @inst_fkey = NULL;
SET @inst_fkey = NULL;
SELECT INST_FKEY INTO @inst_fkey FROM INST_ERRORS WHERE INST_FKEY = NEW.INSTITUTION_FKEY LIMIT 1;
IF (@inst_fkey IS NULL) THEN
INSERT INTO INST_ERRORS (INST_FKEY, ERROR_FKEY)
SELECT NEW.INSTITUTION_FKEY, ERROR.ID FROM ERROR
WHERE ERROR.ISCURRENT = 1 AND ERROR.ISDEFAULT = 1;
END IF;
INSERT IGNORE INTO INST_STATUS (INST_FKEY) VALUES (NEW.INSTITUTION_FKEY);
IF (NEW.ID = 0) THEN
SET @max_id = NULL;
SELECT MAX(ID) INTO @max_id FROM FILE_INFO;
IF (@max_id IS NULL) THEN SET @max_id = 0;
END IF;
SET NEW.ID = @max_id+1;
END IF;
SET NEW.FILE_NAME = CONCAT(DATE_FORMAT(NOW(), '%Y%m%d%h%i%s'), '_', NEW.ID);
END;
//
[18 Sep 2007 19:02]
Tanner Ratzlaff
I think I found the issue. In my tirgger I had "SET NEW.ID = @max_id+1;" and this was screwing up the auto_increment/LAST_INSERT_ID().
[23 Sep 2007 11:51]
Valeriy Kravchuk
So, looks like this is not a bug.

Description: I’m using MySQL v5.0.45 and the query “SELECT LAST_INSERT_ID()” is returning 0 instead of the row id. The row does get inserted into the table and LAST_INSERT_ID() worked in MySQL v5.0.27. Also, if an insert was done into another table before the insert into the FILE_INFO table, the row id of that table will be returned and not the one from FILE_INFO. When I create a table just like FILE_INFO without the foreign key constraint and without the tirgger and insert into it, the LAST_INSERT_ID() works correctly. How to repeat: Below is the CREATE statement for the table I’m inserting into and the INSERT statement I’m using. I do have a BEFORE INSERT TRIGGER set up on the FILE_INFO table that sometimes inserts into a different table, but the id from this insert is not being returned. CREATE TABLE `prep`.`FILE_INFO` ( `ID` int(10) unsigned NOT NULL auto_increment, `INSTITUTION_FKEY` int(10) unsigned NOT NULL, `GROUPING_FKEY` int(10) unsigned default NULL, `BATCH_FKEY` int(10) unsigned NOT NULL, `FILE_NAME` varchar(45) default NULL, `YEAR_VALUE` smallint(5) unsigned default NULL, `TERM` varchar(45) default NULL, `FACULTY` varchar(45) default NULL, `OPTIONAL` varchar(45) default NULL, `NUMBER` int(10) unsigned NOT NULL default '0', `MANUAL1` varchar(45) default NULL, `MANUAL2` varchar(45) default NULL, `MANUAL3` varchar(45) default NULL, `SCAN_BY` varchar(45) default NULL, `SCAN_DATE` timestamp NULL default NULL, `EDIT_BY` varchar(45) default NULL, `EDIT_DATE` timestamp NULL default NULL, `ERROR` tinyint(3) unsigned NOT NULL default '0', `DONE` tinyint(3) unsigned NOT NULL default '0', `MUSTFIX` tinyint(3) unsigned NOT NULL default '0', PRIMARY KEY (`ID`), UNIQUE KEY `FILE_NAME` (`FILE_NAME`), KEY `INSTITUTION_FKEY` (`INSTITUTION_FKEY`), KEY `BATCH_FKEY` (`BATCH_FKEY`), KEY `TERM` (`TERM`), KEY `YEAR_VALUE` (`YEAR_VALUE`), KEY `SCAN_DATE` (`SCAN_DATE`), KEY `EDIT_DATE` (`EDIT_DATE`), CONSTRAINT `FILE_INFO_ibfk_1` FOREIGN KEY (`BATCH_FKEY`) REFERENCES `BATCH` (`ID`) ON DELETE CASCADE ) ENGINE=InnoDB AUTO_INCREMENT=2053 DEFAULT CHARSET=latin1; INSERT INTO prep.FILE_INFO (INSTITUTION_FKEY, TERM, YEAR_VALUE, NUMBER, FACULTY, OPTIONAL, BATCH_FKEY, MANUAL1, MANUAL2, MANUAL3, SCAN_BY, SCAN_DATE) VALUES ('21','Winter','2007','1','3','TEST1','9000','man1','man2','man3','',NOW())