2013-07-29 3 views
1

user_table_a에서 user_table_b로 다음 업데이트를 수행해야합니다. 그것은 내가 생각보다 훨씬 더 어려워 보입니다. 그래서 나는 문법과 관련하여 뭔가를 놓치고 있다고 생각합니다. 다음은 테이블 구조입니다.MySQL의 동적 대량 테이블 업데이트

CREATE TABLE user_table_a (
    id INT(11) NOT NULL AUTO_INCREMENT, 
    email VARCHAR(255), 
    points INT(11) 
); 

CREATE TABLE user_table_b (
    id INT(11) NOT NULL AUTO_INCREMENT, 
    email VARCHAR(255), 
    score INT(11), 
    user_table_a_id INT(11) 
); 

사용자는 이메일 값으로 식별되는 두 테이블의 동일한 사람입니다. 전자 메일은 시스템에 고유합니다. user_table_b에 user_table_a_id 필드가 새로 추가되었으며 현재 비어 있습니다. 이 두 테이블 간의 링크로 전자 메일을 사용하여 각 user_table_a id의 올바른 값을 user_table_b의 해당 위치로 업데이트하려고합니다. 나는 이것이 PHP 나 저장 프로 시저를 이용하여 수행 될 수 있음을 알고 있지만, 나는 그것들 없이는 이것을하려고 노력하고있다. 지금까지 내 질문에 실패했습니다.

# this fails because the subquery returns more than one record and ... 
# because a subquery cannot reference the table being update in the main query 
UPDATE user_table_b SET user_table_a_id = (SELECT user_table_a.id FROM user_table_a, user_table_b WHERE user_table_a.email = user_table_b.user_email GROUP BY user_table_a.id) WHERE 1; 

내가 시도하는 것이 가능한지 확실하지 않지만 계속 연구 할 것입니다. 도움을 준 사람에게 감사드립니다.

+1

대신 user_table_b의, 두 번째 표는 또한 user_table_a라고합니다. –

+0

@HamzaKubba 사실, xQbert가 나를 때렸습니다. 좋은 캐치들. – usumoio

답변

2
UPDATE user_table_b b SET user_table_a_id = (SELECT a.id FROM user_table_a a WHERE a.email = b.email); 
+0

하위 쿼리가 조인보다 속도가 훨씬 빠름에도 불구하고이 방법을 사용할 수 있습니다. –

+0

최종 버전의 하위 쿼리에서 제한 절을 사용했습니다. 이걸 보여줘서 고마워. 이것은 강력한 도구입니다. – usumoio

2

업데이트와 함께 내부 조인을 사용할 수 있습니다. 이 작업 (하지 않을 경우 알려주세요)해야합니다

UPDATE user_table_b utb 
    INNER JOIN user_table_a uta 
    ON uta.email = utb.email 
    SET utb.user_table_a_id = uta.id;