ようこそ!浜村拓夫の世界へ

    ブログ内検索

    最近の記事

    ブックマーク数の多い記事

    Blog Translation

    Powered By FC2ブログ

    Powered By FC2ブログ
    ブログやるならFC2ブログ


    FC2ブログ LOGIN

    with Ajax Amazon

    MySQLのUPDATEでサブクエリを使う方法

    このエントリーを含むはてなブックマーク はてなブックマーク - MySQLのUPDATEでサブクエリを使う方法 あとで読む
    データベースで、データを一括コピーしたい。
    =MySQLのテーブルAにあるデータを、別のテーブルBにコピーする。

    (1) テーブルAとテーブルBを結合する。
    (2) コピーする条件(商品番号が同じ商品同士の場合)を指定する。
    (3) UPDATE句で、テーブルA側にあるデータをテーブルB側のカラムに書き込む。

    この(1)から(3)までの処理を1回のSQLで実行しようと思って、(1)と(2)をまとめたサブクエリを書こうと思った。
    なんかうまく動かないので調べてみたら、MySQLのサブクエリは、テーブルの扱いに制約があることが分かった。

    Google - MySQL update サブクエリ の検索結果 約 16,200 件

    ●MySQLのサブクエリの制約
    MySQLはUpdate, Deleteで自己相関サブクエリが使えない

    演習問題で自己結合してUPDATEする問題があるんですが、これMySQLだと動きません。
    公式マニュアルにも自己相関サブクエリ使えないと書いてありました。



    MySQLのサブクエリでは、テーブルの更新と参照を同時に行うことができない。

    逆に言えば、テーブルを参照するだけで更新しないサブクエリならちゃんと動くはず。

    MySQL 5.1 リファレンスマニュアル :: 12.2.10 UPDATE 構文

    複合テーブルをカバーする UPDATE 演算を行う事もできます。
    UPDATE items,month SET items.price=month.price
    WHERE items.id=month.id;

    前出の例はカンマ演算子を利用する内部接合を表しますが、複合テーブルの UPDATE ステートメントは、LEFT JOIN のような、SELECT ステートメント内で許容される接合タイプを利用する事ができます。



    この方法でシンプルに書いたらうまくいった。
    =サブクエリの中をゴチャゴチャ書いて、テーブルの結合方法を間違えていただけだった。

    達人に学ぶ SQL徹底指南書 (CodeZine BOOKS)達人に学ぶ SQL徹底指南書 (CodeZine BOOKS)
    (2008/02/07)
    ミック

    商品詳細を見る


    MySQLの日本語と英語のマニュアルを読んでいたら、訳が変だと思う箇所があった。

    (英語)
    MySQL 5.0 Reference Manual :: 12.2.11 UPDATE Syntax

    Currently, you cannot update a table and select from the same table in a subquery.



    (日本語訳)
    MySQL 5.1 リファレンスマニュアル :: 12.2.10 UPDATE 構文

    現在は、サブクエリの中で1つのテーブルを更新し、同じテーブルから選択する事はできません。





    英語のネイティブスピーカーは、文頭から読み下していく。
    SIM同時通訳方式で、この英文を読むと以下のようなかんじになるはず。

    Currently, / you cannot / update a table / and select / from the same table / in a subquery.
    現時点では / あなたはできない / テーブルを更新する / そして選択する / 同じテーブルから / 一つのサブクエリの中で



    (意訳)
    「現時点では、一つのサブクエリの中で、あるテーブルを更新してさらにその同じテーブルを選択することはできない。」

    「MySQLの現バージョンでは、1個のサブクエリの中で、同一テーブルの更新と参照を同時に行うことはできない。」

    テーブルの参照が再帰=読み込み回数が急増=処理が遅くなるのかな?
    テーブルを更新しつつ、同時にその更新結果を利用するような処理をやらせるサブクエリは、MySQL5.1だとサポートしてないと。

    MySQL以外のDBもいじってみて、違いを知っておかないといかんな~。
    関連記事

    コメント

    コメントの投稿


    管理者にだけ表示を許可する

    トラックバック

    トラックバックURL:
    http://hamamuratakuo.blog61.fc2.com/tb.php/427-31f49c2d

    FC2Ad