Java MYSQL LAST_INSERT_ID未按预期工作。我怎么修理?

Java MYSQL LAST_INSERT_ID未按预期工作。我怎么修理?,java,mysql,procedure,Java,Mysql,Procedure,我编写了MySQL StoredProcedure来为每个表值创建并返回新的ID,但是,它在MySQL工作台和Java应用程序的最后一次_insert_ID()上得到了错误的值 将从多个会话调用此过程 CALL `GET_NEW_ID`('test', @test); select @test; 它给我“14121500000”,这意味着last_insert_id()始终返回0。 我认为它正确地将新数据插入到seq_数据中 CREATE PROCEDURE `GET_NEW_ID`(IN V

我编写了MySQL StoredProcedure来为每个表值创建并返回新的ID,但是,它在MySQL工作台和Java应用程序的最后一次_insert_ID()上得到了错误的值

将从多个会话调用此过程

CALL `GET_NEW_ID`('test', @test);
select @test;
它给我“14121500000”,这意味着last_insert_id()始终返回0。 我认为它正确地将新数据插入到seq_数据中

CREATE PROCEDURE `GET_NEW_ID`(IN V_TABLE VARCHAR(10), OUT V_ID VARCHAR(12))
BEGIN

    INSERT INTO seq_data ( id, `name`, `stat_date`)
    SELECT IFNULL(MAX(id), 0)+1, V_TABLE, DATE_FORMAT(NOW(),'%Y%m%d') FROM seq_data WHERE name = V_TABLE AND stat_date = DATE_FORMAT(NOW(),'%Y%m%d');
    SET V_ID = concat(DATE_FORMAT(NOW(),'%y%m%d'),LPAD(LAST_INSERT_ID(), 6, '0'));

END
这张桌子看起来像这样

CREATE TABLE `seq_data` (
  `id` int(6) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) COLLATE utf8_bin NOT NULL,
  `stat_date` varchar(8) COLLATE utf8_bin NOT NULL,
  PRIMARY KEY (`id`,`name`,`stat_date`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
我的目标是

CALL `GET_NEW_ID`('test', @test);
select @test;
返回141215000001

CALL `GET_NEW_ID`('test', @test);
select @test;
返回141215000002

CALL `GET_NEW_ID`('hello', @test);
select @test;
return 141215000001

如中所述,LAST_INSERT_ID()返回一个BIGINT(64位)值,该值表示最近执行的INSERT语句为自动增量列设置的第一个自动生成的值,以影响该列

CALL `GET_NEW_ID`('test', @test);
select @test;
在本例中,您正在插入id,因此不会生成自动增量值,因此最后一个插入id返回0

您可以尝试以下方法:

CREATE PROCEDURE `GET_NEW_ID`(IN V_TABLE VARCHAR(10), OUT V_ID VARCHAR(12))
BEGIN

    INSERT INTO seq_data (`name`, `stat_date`)
    SELECT V_TABLE, DATE_FORMAT(NOW(),'%Y%m%d') FROM seq_data WHERE name = V_TABLE AND stat_date = DATE_FORMAT(NOW(),'%Y%m%d');
    SET V_ID = concat(DATE_FORMAT(NOW(),'%y%m%d'),LPAD(LAST_INSERT_ID(), 6, '0'));

END

谢谢@Dondon的回答。但我已经尝试过了,插入id的原因是为了为不同的列“name”获取一个新id。例如,如果我想为表hello获取一个新的id,那么它的id将不会从1开始,因为测试表名有另一个id 1。再次感谢@Dodon,这解释了为什么它不能像我预期的那样工作,我需要找到解决问题的方法。@handicop您做错了。自己生成一个新ID,然后手动插入它不是正确的答案。它忽略了一开始的事务性需求。您甚至不应该有一个
GET\u NEW\u ID()
过程。它应该是自动发生的,因为在表中使用
AUTO_INCREMENT
键插入
INSERT
会产生副作用。嗨@EJP,是的,我刚刚和一个熟悉DB的人聊天,他说的和你在这里写的完全一样。现在我更改了表结构并删除了GET_NEW_ID过程。谢谢!