MySQLで2つのテーブル(A表とB表)を比較し、条件が一致する行だけを更新したい場面はよくあります。特に、同じURLを持つ行に対して、別のカラムの値を更新したい場合などです。この記事では、効率的かつエラーの出ないUPDATE文の書き方を具体例とともに解説します。
1. 結合してUPDATEを行う基本構文
MySQLでは、UPDATE ... JOIN 構文を使うことで、2つのテーブルを結合しながら更新が可能です。基本の構文は以下のようになります。
UPDATE テーブルA AS a INNER JOIN テーブルB AS b ON a.条件カラム = b.条件カラム SET a.更新対象カラム = b.値のカラム;
この形式を用いると、A表とB表を結合し、条件が一致する場合にだけA表の値をB表の値で更新できます。
2. 実際の例:URLが一致した場合にnameを更新する
質問のケースでは、A表とB表のurlが一致したものだけ、A.nameをB.new_nameに更新したい、という内容です。この場合、次のようなクエリが適切です。
UPDATE A AS a INNER JOIN B AS b ON a.url = b.url SET a.name = b.new_name;
このクエリでは、A表とB表のurl列が一致する行のみを対象に、A表のname列をB表のnew_name列の値で更新します。
3. 重複するURLがある場合の対処
もしB表のurl列に重複がある場合、どの値を更新に使うかが曖昧になります。このような場合は、事前にB表を絞り込んで一意な行だけを抽出する必要があります。たとえば、次のようなサブクエリを使用します。
UPDATE A AS a INNER JOIN ( SELECT new_name, url FROM B GROUP BY url HAVING COUNT(url) = 1 ) AS b ON a.url = b.url SET a.name = b.new_name;
このクエリでは、B表の中で重複していないURLだけを抽出し、その結果を使ってA表を更新します。これにより、重複データによる更新ミスを防ぐことができます。
4. 「Unknown column」エラーが出る原因
質問文にある「ERROR 1054 (42S22): Unknown column」は、サブクエリ内で定義したエイリアス名が外側のUPDATE文から参照できない場合に発生します。MySQLでは、UPDATE構文内でサブクエリをJOINする場合、外側のスコープでエイリアスを正確に指定する必要があります。誤ったカラム名やエイリアス指定があると、このエラーが出ることになります。
修正ポイントとしては、SET句内で必ず正しいテーブルエイリアスを指定することが重要です。
5. まとめ
MySQLで2つのテーブルを使って条件付きのUPDATEを行う場合は、UPDATE ... JOIN構文を用いるのが最もシンプルで確実です。エラーを防ぐためには、ON条件とSET句で使用するカラム名・エイリアスを一致させること、そして重複を避けるためのサブクエリ活用がポイントです。
以上を押さえれば、A表とB表の比較更新を安全に実行できるようになります。


コメント