2011년 1월 3일 월요일

JOIN UPDATE (Multiple-table Update)

MySQL에서도 두개 이상의 테이블을 조인하여,
어떤 테이블의 필드 값을 또 다른 테이블의 컬럼에 업데이트하는 것이 가능하다.
물론, 이때 2개 이상의 테이블의 레코드를 상호 업데이트하는 것도 가능하다.


이러한 형태의 작업을 JOIN UPDATE 또는 Multiple table Update라고 표현한다.
아래의 쿼리를 한번 살펴보자.


UPDATE test1 t1, test2 t2
SET t1.target_fd=t2.source_fd
WHERE t1.fdpk=t2.fdpk;


이 쿼리는 test1 테이블과 test2 테이블을 fdpk 컬럼으로 조인한 뒤,
test2 테이블의 source_fd 컬럼의 값을 test1 테이블의 target_fd 컬럼에 업데이트를 실행하게 된다.
이 예제는 하나의 테이블만 업데이트하고 있지만, 아래와 같이 상호 업데이트 하는 형태도 가능하다.


UPDATE test1 t1, test2 t2 
SET t1.target_fd=t2.source_fd,
  t2.target_fd=t1.source_fd
WHERE t1.fdpk=t2.fdpk;

물론 3개 이상의 테이블을 조인하여
n개의 테이블로부터 필드 값을 모아서 하나의 테이블로 업데이트하는 것도 가능하다.



단, 이런 형태의 업데이트에서 주의해야 할것이 있다.
1. UPDATE 쿼리에 대해서는 실행 계획을 확인할 수 없으므로, JOIN의 순서를 확인할 수 없다.
   조인의 순서에 따라서 상당한 처리 성능 차이를 보일 수 있으므로, 가능한 조인의 순서를 고정시켜서 실행한다.
2. JOIN에 참여하는 테이블 Tab1과 Tab2가 1:M 관계로 조인될 경우
   Tab1 테이블의 값을 Tab2로 업데이트하는 것은 문제없지만, Tab2를 Tab1으로 업데이트하는 경우
   M개의 값 중에서 어떤 값이 업데이트될지 예측할 수 없다.
   M:M 관계의 조인이라면 어느 쪽으로 업데이트되든지 업데이트 되는 값을 예측할 수 없게 된다.
   

댓글 1개: