2017-03-28 3 views
1

특정 이벤트가 내 데이터베이스를 INSERT으로 업데이트하는 응용 프로그램을 두 테이블 AB에 적용하는 응용 프로그램이 있습니다. 외래 키가 id_AAB, id_B에서 AB 인 연관/링크 테이블이 다 대다 관계를 매핑하는 추가 연결/링크 테이블이 있습니다. 내 질문은 AB 외래 키 중 하나가 응용 프로그램 논리 (이 경우 AUTO_INCREMENT ID이기 때문에)에 알려지지 않을 때 가장 잘 업데이트하는 방법입니다.자동 증가 외래 키가있는 MySQL 연결 테이블을 자동으로 업데이트합니다.

추가 세부 정보 : 그 값을 삽입하기 전에 알려진되지 않도록

  • id_BAUTO_INCREMENT로 설정됩니다.
  • B은 복수 행 INSERT으로 업데이트됩니다. A은 단일 행 INSERT입니다.
  • id_B은 고유 키이지만 ON DUPLICATE KEY UPDATE이 처리 할 수있는 중복이있을 수 있습니다. 이는 이전 값을 새 값으로 바꿉니다.
  • A 및 은 동일한 이벤트에 대한 응답으로 동일한 트랜잭션에서 업데이트됩니다.
  • InnoDB를 사용하는 MySQL 5.7.

내 생각은 AB에 최종 INSERTLAST_INSERT_ID()에서 id_B의 값을 얻을 것입니다하지만 분명히 이것은 단지 여러 행의 첫 번째 행의 값을 반환하는 저장 프로 시저의 모든 삽입 문을 포함했다 삽입 : https://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_last-insert-id

AB을 업데이트하는 로직을 부모 테이블을 업데이트하는 데 사용되는 것으로부터 트리거 또는 다른 명령문으로 분리 할 수있는 보너스가 있다고 가정합니다.

편집 : 댓글에 대한 응답. 이것은이 순간에 B에서 id_B의 가장 큰 가치를 찾을 수

SET @before = (SELECT MAX(id_B) AS maxIDB 
       FROM B); 

AB 장소 다음 문으로 데이터를 삽입하는 데 사용되는 문 (들) 전

+0

A의 각 레코드와 B의 각 레코드는 항상 AB에 하나 이상의 레코드를 포함합니까? – toonice

+0

분명히 말하면 세 개의 테이블 A, B 및 A_B가 있습니다. 맞습니까? –

+0

둘 중 하나만 SQL INSERT 문을 사용하지 않는 한 두 테이블을 "동시에"삽입 할 수 없습니다. 하나는 다른 하나보다 항상 먼저 발생합니다. –

답변

0

.... 이후에 B에 삽입하면 이보다 큰 값이됩니다. 우리는이 사실을 우리의 장점으로 활용할 수 있습니다. 위에서 언급 한 삽입 문 장소 다음 문 후

...

INSERT INTO AB (id_A, 
       id_B) 
SELECT id_A_value, 
     B.id_B 
FROM B 
WHERE B.id_B > @maxIDB; 

주 : 위의 질문으로 나는 id_A이 알려진 것을 가정하고있다. 이 값을 id_A_value으로 나타냅니다.

이 문은 알려진 값이 id_A이고 모두 새로 생성 된 값이 모두 id_B 인 행을 AB 행에 삽입합니다.

질문이나 의견이 있으시면 언제든지 그에 따라 설명문을 게시하십시오.

관련 문제