2012-05-25 2 views
0

У меня есть две таблицы в базе данных MySQL: «сообщения» и «message_tags». В таблице «сообщения» имеется столбец автоматического ввода «message_id». В Java я хочу добавить пакет сообщений в базу данных с помощью пакета java.sql. Я хочу сделать это в одной транзакции для сохранения запросов.Получить все вставки ids в транзакции

Мой 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 

Можно ли получить все вновь созданные идентификаторы из таблицы сообщений обратно в Java таким образом, что они могут быть сопоставлены с первоначальными сообщениями? Что-то вроде этого:

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

Сделки не сохраняют запросы. Единственное, что делает транзакция, это позволить вам откатиться, если не удастся. Вы все равно должны выполнять каждый запрос. Ответ jcho360 прав, но он не сохраняет запросы. Вы также можете запустить запрос last_insert_id из Java, чтобы избежать использования пользовательских переменных. Вы можете объединить все значения в один большой INSERT, но после этого вы не сможете получить last_insert_id после каждого. –

+0

Спасибо за ваш комментарий, моя формулировка была неправильной. База данных удалена, и я хочу сохранить соединения, отправив сообщения в виде пакета в транзакции. – Thomas

+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 вручную, по крайней мере, вы создаете процедуру или функцию.

+0

Я думал об этом, и понял, что он немного сложнее. Возврат содержимого временной таблицы last_insert_id был вставлен, а затем неявным образом полагался на что-то вроде сообщений [0] (Message1) = MessageIds [0]. Из-за того, что я нервничаю, подумайте, что у меня возникнет соблазн сделать их 1 за раз, а не в партии. –

+0

Благодарим за предложение, я постараюсь реализовать это и дам отзывы. – Thomas

+0

это нормально, просто сообщите нам, если вы решите его, пожалуйста. – jcho360

Смежные вопросы