2012-01-06 2 views
16

나는 비정규 화를 위해 정확히 같은 값을 필요로하는 두 개의 테이블을 가지고 있습니다.MySql은 한 번에 두 테이블을 업데이트합니다.

다음은 쿼리입니다.

첫 번째 테이블

UPDATE Table_One 
SET win = win+1, streak = streak+1, score = score+200 
WHERE userid = 1 AND lid = 1 LIMIT 1 

초 테이블

UPDATE Table_Two 
SET win = win+1, streak = streak+1, score = score+200 
WHERE userid = 1 LIMIT 1 

당신은 두 테이블 사이의 유일한 차이는 어쨌든 분야 lid

이없는 자신의 이름과 테이블이있다 볼 수 있듯이 두 업데이트를 하나만 결합하면됩니까?

답변

32

설명서에 설명 된대로 다중 테이블 업데이트가 가능해야합니다.

http://dev.mysql.com/doc/refman/5.5/en/update.html

UPDATE Table_One a INNER JOIN Table_Two b ON (a.userid = b.userid) 
SET 
    a.win = a.win+1, a.streak = a.streak+1, a.score = a.score+200, 
    b.win = b.win+1, b.streak = b.streak+1, b.score = b.score+200 
WHERE a.userid = 1 AND a.lid = 1 AND b.userid = 1 

참고 : 멀티 테이블 LIMIT를 지원하지 않기 때문에이 세부 사항에 따라 더 슬픔의 원인이 될 수 있습니다.

저장 프로 시저 또는 트랜잭션이 더 나은 솔루션 일 수 있습니다. Table_Two에 Table_One 많은 관계로 하나 하나에 하나가있는 경우

1

두 개의 별도 쿼리이므로 처리해야합니다. 죄송하지만, 동일한 데이터로 두 개의 테이블을 업데이트하는 경우 데이터베이스를 설계하는 더 좋은 방법이있을 것입니다. 프로그래밍을 계속 기억하십시오 DRY.

편집 : 취소해야합니다. 여러 테이블에 사용할 수 있지만 ORDER BY 또는 LIMIT은 사용할 수 없습니다.

+0

나는 당신이 의미하는 바를 알고 있지만, 우리의 경우에는 테이블 1에 대한 점수를 너무 자주 재설정했습니다. 표 2는 영구 점수이므로 두 개의 표가 필요한 이유입니다. 그것은 내가 행 (배치 프로세스)에서 5 개의 업데이트 쿼리를 가지고 있고 db 로의 트립을 제한 할 수 있는지 궁금합니다. – user962449

+1

동일한 작업을 수행하는 테이블에 필드를 추가하는 것이 더 쉽지는 않습니다.이 작업은 기본적으로 '1'이지만, 테이블을 "재설정"해야 할 때'0 '으로 설정합니다. –

+0

@ user962449 비슷한 해결책을 찾으면서이 문제가 발생했습니다. 이 답변은 잘못되었습니다. 더 좋은 대답을 더 받아 들여야합니다. –

8

이 작동합니다 : 당신은 테이블을 조인 할 수있는 경우

UPDATE Table_One T1, Table_Two T2 
SET T1.win = T1.win+1, T1.streak = T1.streak+1, T1.score = T1.score+200, 
    T2.win = T2.win+1, T2.streak = T2.streak+1, T2.score = T2.score+200 
WHERE T1.userid = 1 AND T1.lid = 1 AND T2.userid = T1.userid; 
0

는, 당신은 두 테이블의 뷰를 만들 수 있습니다, 다음 해당보기를 통해 업데이트하십시오. 귀하의 예에서는 사용자 ID이 적합한 키일 수 있습니다.

보기를 만들 때 following guidelines을 고수해야합니다.

관련 문제