- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我编写了 MySQL StoredProcedure 来为每个表值创建和返回新 ID,但是,它在 MySQL WorkBench 和 Java 应用程序的 last_insert_id() 上得到了错误的值。
此过程将从多个 session 中调用。
CALL `GET_NEW_ID`('test', @test);
select @test;
它给我“141215000000”,这意味着 last_insert_id() 始终返回 0。不过,我看到它正确地将新数据插入到 seq_data 中。
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;
返回 141215000001
最佳答案
如 MySQL documentation 中所述, LAST_INSERT_ID() 返回一个 BIGINT(64 位)值,表示第一个自动生成的值,该值由最近执行的影响此类列的 INSERT 语句为 AUTO_INCREMENT 列设置。
在您的情况下,您要插入 ID,因此不会生成 AUTO_INCREMENT 值,因此 LAST_INSERT_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
关于java - MYSQL LAST_INSERT_ID 未按预期工作。我该如何解决?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27476072/
这个问题在这里已经有了答案: Easy mysql question regarding primary keys and an insert (4 个答案) 关闭 9 年前。 所以我想用公共(pu
我环顾四周,仍然对如何获取最后插入的 ID 感到困惑。我在正在执行的 mysql 语句末尾添加了语句 SELECT LAST_INSERT_ID();。我将值存储在 prID = Convert.To
所以我有如下 3 个表。 TOPICS TOPIC_TAGS Tags topic_id tag_id tag_id topic_data topic_id
$stmt2 = $db->prepare("INSERT INTO usertabbrige(`tabId`,`uId`)
我使用 PDO 在 PHP/MySql 上运行。 假设我有一个这样的查询。 $OrderId 在“Orders”表中自动递增。我可以使用 LAST_INSERT_ID() 在“Orders”和“Bou
CREATE FUNCTION `getSequenceNumber` ( company_id INTEGER, sequence_name varchar(255)) RETURNS INT(10
更新2:如果我手动将下面的EXECUTE代码示例替换为要执行的实际SQL代码,它工作得非常好,这告诉我这个问题已经厌倦了PREPARE、EXECUTE和DEALLOCATE PREPARE。 更新 1
我有以下代码。问题在于 SELECT LAST_INSERT_ID() 这总是返回最后插入的行。如果在获取最后一行之前实际插入了一行,我是否可以使用 INSERT IGNORE 检查,或者我是否可以简
我看不出我做错了什么,请帮忙。我正在学习 Select Last_Insert_Id,但我已经被困了几天了。 $result2 = $mysqli1->query("SELECT LAST_INSER
我有 3 个表: Words { wordId, name } WordGroups { wordGroupId, type} WordSets { wordSetId, wordId, wordGr
在 mysql 中创建线程安全序列时,我遇到了 mysql 文档 - https://dev.mysql.com/doc/refman/5.6/en/information-functions.htm
是否可以在插入查询中使用 LAST_INSERT_ID()? INSERT INTO mytable (col1, col2) VALUES ('val1', null), ('val2', LAST
我看过 official documentation但我还是有点困惑。 假设我有一个程序,它运行并执行插入,然后我请求 LAST_INSERT_ID(),我是从我的程序实例运行的插入中获取最后一个插入
我有一个包含三个查询的 mysql 事务 在第三个查询中,我试图从前两个查询中提取 last_insert_id 值。 VALUES ('".$result1[last_id]."','".$resu
我在 mysql 中有一个存储过程,它正在更新很多行然后插入一个(具体来说是分层数据结构)。除了我设置 @insert_id 变量的最后一段代码外,不要看太多代码。 CREATE DEFINER=`r
例如,如果我有插入查询: INSERT INTO user(username) VALUES('admin'); 然后用获取插入记录的id LAST_INSERT_ID(); 看起来找到了,但是如果在
我有两个表格,问题 和答案。answers 包含一个键 *question_id* 当我创建一个问题时,我将一条记录插入到questions 表中,并将几条记录插入到answers 表中。是否可以使用
我有这个问题:我有一个存储过程,它将行插入到具有自动递增列 a 的表 A,然后将一行插入到表 B,该表具有到列 A.a 的外键 b。我正在使用 LAST_INSERT_ID 获取列新插入行的值。但是
假设我们有 2 个数据库:a 和 b,以及表 a.test1 和 b.test2. 如果我需要在表a.test1中插入一行,并返回LAST_INSERT_ID()插入到b.test2中,将LAST_I
如果我有以下两个功能: int AccessDb::InsertColValue(string tableName, string col, string val) { try {
我是一名优秀的程序员,十分优秀!