2012-05-25 2 views
0

MySQL 데이터베이스에 두 개의 테이블, 즉 "messages"및 "message_tags"가 있습니다. "messages"테이블에는 자동 증가 열 "message_id"가 있습니다. Java에서 java.sql 패키지를 사용하여 데이터베이스에 일괄 처리 메시지를 추가하려고합니다. 쿼리를 저장하기 위해 하나의 트랜잭션에서이 작업을 수행하려고합니다.트랜잭션의 모든 삽입 ID 가져 오기

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를 얻을 수 있습니다 :

내 SQL 코드의 모양은? 이런 식으로 뭔가 : 그것은 정적 또는 동적 인 경우

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

트랜잭션은 쿼리를 저장하지 않습니다. 트랜잭션이 수행하는 유일한 작업은 실패한 경우 롤백 할 수있게하는 것입니다. 각 쿼리를 실행해야합니다. jcho360의 대답은 맞지만 쿼리를 저장하지는 않습니다. Java에서 last_insert_id 쿼리를 실행하여 사용자 변수를 사용하지 않아도됩니다. 모든 값을 하나의 큰 INSERT로 결합 할 수는 있지만, 각 INSERT 후에 last_insert_id를 얻을 수 없습니다. –

+0

의견을 보내 주셔서 감사합니다. 데이터베이스가 원격이며 트랜잭션에서 메시지를 일괄 처리로 보내서 연결을 저장하려고합니다. – Thomas

+0

오, 당신은 트랜잭션을 필요로하지 않는 한, 당신은 여전히 ​​트랜잭션을 일괄 처리 할 필요가 없습니다. –

답변

2

당신이 지정하지 않은,하지만 난 당신이이 같은 사용할 수 있습니다 생각 : 당신이

select @message1; 

을 할 경우

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 

을 결과는 1234가 될 것이므로

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

하지만 최소한 프로 시저 또는 함수를 만들 때 SQL 변수를 수동으로 지정해야합니다.

+0

나는이 줄을 따라 생각하고 있었는데, 조금 더 복잡하다는 것을 깨달았다. 임시 테이블 last_insert_id의 내용을 반환 한 다음 메시지 [0] (Message1) = MessageIds [0]과 같은 것을 사용하여 암시 적으로 의존합니다. 나를 긴장 시키지만, 배치 대신에 한 번에 하나씩 해보기를 원합니다. –

+0

제안 해 주셔서 감사합니다.이를 구현하려고하고 이후 피드백을 제공 할 것입니다. – Thomas

+0

괜찮 았으면 해결해 주시면 알려주세요. – jcho360