REPLACE 構文

REPLACE [LOW_PRIORITY | DELAYED]
    [INTO] tbl_name [(col_name,...)]
    VALUES ({expr | DEFAULT},...),(...),...

または:

REPLACE [LOW_PRIORITY | DELAYED]
    [INTO] tbl_name
    SET col_name={expr | DEFAULT}, ...

または:

REPLACE [LOW_PRIORITY | DELAYED]
    [INTO] tbl_name [(col_name,...)]
    SELECT ...

REPLACE は、もしテーブル内の古い行が PRIMARY KEYUNIQUE インデックスの新しい行と同じ値を持っていれば、古い行は新しい行が挿入される前に削除されるという事以外、INSERT と全く同じように機能します。詳しくは 項 「INSERT 構文」 を参照してください。

REPLACE は SQL スタンダードの MySQL 拡張子です。それは挿入、または 削除 と挿入を行います。挿入、または 更新 — を行うスタンダード SQL — の別の MySQL 拡張子に関しては、 項3. 「INSERT ... ON DUPLICATE KEY UPDATE 構文」 を参照してください。

テーブルが PRIMARY KEYUNIQUE インデックスを持たなければ、REPLACE ステートメントの利用は何の意味も持たないという事を覚えておいてください。新しい行が別の行を複製するかどうかを決める為に利用するインデックスが無い為、それは INSERT と同等になります。

全てのカラムの値は、REPLACE ステートメントの中で指定された値から取られています。紛失したカラムは、INSERT と同じように、デフォルト値に設定されます。現在の行から値を参照し、それらを新しい行の中で利用する事はできません。もし、SET col_name = col_name + 1 のような割り当てを利用すると、右側のカラム名の参照は DEFAULT(col_name) として扱われるので、その割り当ては SET col_name = DEFAULT(col_name) + 1 と同等になります。

REPLACE を利用する為には、テーブルに対して INSERTDELETE 権限の両方を持つ必要があります。

REPLACE ステートメントは、影響を受けた行数を表す為に総数を返します。これは、削除、挿入された行の総数です。もし単列 REPLACE の総数が1であれば、行が1つ挿入され、削除された行はないという事になります。 もし総数が1よりも大きければ、新しい行が挿入される前に、1つまたはそれ以上の行が削除されたという事になります。もしテーブルが複数の固有インデックスを含んでいれば、単列が複数の古い行を置き換える事が可能であり、そして新しい行は異なる固有のインデックス内の異なる古い行に値を複製します。

影響を受けた行の総数によって、REPLACE が行を追加しただけなのか、それとも行の置き換えも行ったのか、という事を簡単に知る事ができます。総数が1(追加された)か、それよりも大きい(置き換えが行われた)かを確認してください。

もしC API を利用していれば、mysql_affected_rows() 関数を利用する事で、影響を受けた行の総数を得る事ができます。

現在は、サブクエリの中で1つのテーブルに置き換え、同じテーブルから選択する事はできません。

MySQL は次のアルゴリズムを REPLACE (と LOAD DATA ... REPLACE)に利用します。

  1. テーブルに新しい行の挿入を試みてください。

  2. 主キーか固有インデックスに複製キー エラーが起きた為に挿入に失敗したら:

    1. 複製キー値を持つ矛盾した行をテーブルから削除してください。

    2. テーブルに新しい行の挿入をもう一度試みてください。