2012-05-25 36 views
0

我在MySQL數據庫中有兩個表:「messages」和「message_tags」。 「消息」表具有自動增量列「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 

是否有可能得到消息表回Java所有新生成的ID的方式,他們可以匹配到原來的消息?事情是這樣的:

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

交易不保存查詢。交易所做的唯一事情是允許您在發生失敗時回滾。您仍然必須執行每個查詢。 jcho360的答案是正確的,但不保存查詢。您也可以運行Java中的last_insert_id查詢以避免使用用戶變量。你可以將所有的值組合成一個大的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的內容,然後隱式地依靠諸如Messages [0](Message1)= MessageIds [0]的內容來做。儘管讓我感到緊張,但我想我會一次嘗試1次,而不是一批。 –

+0

謝謝你的建議,我會盡力實現這一點,並會在以後給予反饋。 – Thomas

+0

沒關係,只是讓我們知道如果你解決它請。 – jcho360

相關問題