[mysql] 하나의 MySQL 테이블을 다른 값으로 업데이트

다른 정보를 기반으로 한 MySQL 테이블을 업데이트하려고합니다.

original테이블은 다음과 같습니다.

id | value
------------
1  | hello
2  | fortune
3  | my
4  | old
5  | friend

그리고 tobeupdated테이블 외모가 좋아 :

uniqueid | id | value
---------------------
1        |    | something
2        |    | anything
3        |    | old
4        |    | friend
5        |    | fortune

나는 업데이트 할 idtobeupdatedid에서 original를 기반으로 value(에 저장된 문자열 VARCHAR(32)필드).

업데이트 된 테이블은 다음과 같을 것입니다.

uniqueid | id | value
---------------------
1        |    | something
2        |    | anything
3        | 4  | old
4        | 5  | friend
5        | 2  | fortune

작동하는 쿼리가 있지만 매우 느립니다.

UPDATE tobeupdated, original
SET tobeupdated.id = original.id
WHERE tobeupdated.value = original.value

이것은 내 CPU를 최대로 사용하고 결국 수행 된 업데이트의 일부만으로 시간 초과로 이어집니다 (일치 할 값이 수천 개 있음). 에 의한 매칭 value이 느릴 것이라는 것을 알고 있지만 이것이 내가 함께 매칭해야하는 유일한 데이터입니다.

이와 같은 값을 업데이트하는 더 좋은 방법이 있습니까? 더 빠를 경우 병합 된 결과에 대한 세 번째 테이블을 만들 수 있습니까?

MySQL 시도 -다른 테이블의 값으로 테이블을 어떻게 업데이트 할 수 있습니까? ,하지만 실제로 도움이되지 않았습니다. 어떤 아이디어?

MySQL 초보자를 도와 주셔서 미리 감사드립니다!



답변

UPDATE tobeupdated
INNER JOIN original ON (tobeupdated.value = original.value)
SET tobeupdated.id = original.id

그것은 그것을해야하며 실제로 당신의 일을 정확히 수행합니다. 그러나 여러 개의 ‘WHERE’조건보다 조인에 ‘JOIN’구문을 선호하므로 읽기가 더 쉽다고 생각합니다.

느리게 달리는 경우 테이블은 얼마나 큽니까? tobeupdated.value및에 인덱스가 있어야합니다.original.value

편집 : 쿼리를 단순화 할 수도 있습니다.

UPDATE tobeupdated
INNER JOIN original USING (value)
SET tobeupdated.id = original.id

USING(A)의 약칭이며 모두 표라는 동일가 가입 할 때 key등을 id. 즉 equi-join- http : //en.wikipedia.org/wiki/Join_( SQL)#Equi-join


답변

이러한 테이블의 용도에 따라 다르지만 삽입 및 업데이트시 원본 테이블에 트리거를 두는 것을 고려할 수 있습니다. 삽입 또는 업데이트가 완료되면 원본 테이블의 항목 하나만 기반으로 두 번째 테이블을 업데이트합니다. 더 빠를 것입니다.


답변