获取事务中的所有插入ID

时间:2012-05-25 13:32:11

标签: java mysql transactions last-insert-id

我在MySQL数据库中有两个表:“messages”和“message_tags”。 “messages”表有一个自动增量列“message_id”。在Java中,我想使用java.sql包向数据库添加一批消息。我想在一个事务中执行此操作以保存查询。

我的SQL代码应如下所示:

START TRANSACTION
INSERT INTO messages(`message`) VALUES ('message1');
INSERT INTO messages_tags(`message_id`, `tags`) VALUES (LAST_INSERT_ID(), 'tagfoo1');
INSERT INTO messages_tags(`message_id`, `tags`) VALUES (LAST_INSERT_ID(), 'tagbar1');
INSERT INTO messages(`message`) VALUES ('message2');
INSERT INTO messages_tags(`message_id`, `tags`) VALUES (LAST_INSERT_ID(), 'tagfoo1');
INSERT INTO messages(`message`) VALUES ('message3');
INSERT INTO messages_tags(`message_id`, `tags`) VALUES (LAST_INSERT_ID(), 'tagfoo2');
...
COMMIT

是否有可能以一种方式将消息表中所有新生成的id返回给java,以便它们可以与原始消息匹配?像这样:

message1 => 1234
message2 => 1235
message3 => 1236
...

1 个答案:

答案 0 :(得分:2)

你没有说明它是静态的还是动态的,但我想你可以使用这样的东西:

START TRANSACTION
INSERT INTO messages(`message`) VALUES ('message1');
@message1:=last_insert_id();
INSERT INTO messages_tags(`message_id`, `tags`) VALUES (LAST_INSERT_ID(), 'tagfoo1');
@message2:=last_insert_id();
INSERT INTO messages_tags(`message_id`, `tags`) VALUES (LAST_INSERT_ID(), 'tagbar1');
@message3:=last_insert_id();
INSERT INTO messages(`message`) VALUES ('message2');
INSERT INTO messages_tags(`message_id`, `tags`) VALUES (LAST_INSERT_ID(), 'tagfoo1');
@message4:=last_insert_id();
INSERT INTO messages(`message`) VALUES ('message3');
INSERT INTO messages_tags(`message_id`, `tags`) VALUES (LAST_INSERT_ID(), 'tagfoo2');
@message5:=last_insert_id();
...
COMMIT

如果你做

select @message1;

结果将是1234,所以你有

@message1 => 1234
@message2 => 1235
@message3 => 1236
...

但您必须手动指定SQL变量,至少要创建一个过程或一个函数。

相关问题