REPLACE [LOW_PRIORITY | DELAYED] [INTO]tbl_name
[(col_name
,...)] VALUES ({expr
| DEFAULT},...),(...),...
または:
REPLACE [LOW_PRIORITY | DELAYED] [INTO]tbl_name
SETcol_name
={expr
| DEFAULT}, ...
または:
REPLACE [LOW_PRIORITY | DELAYED] [INTO]tbl_name
[(col_name
,...)] SELECT ...
REPLACE
は、もしテーブル内の古い行が PRIMARY
KEY
か UNIQUE
インデックスの新しい行と同じ値を持っていれば、古い行は新しい行が挿入される前に削除されるという事以外、INSERT
と全く同じように機能します。詳しくは
項12.2.4. 「INSERT
構文」 を参照してください。
REPLACE
は SQL スタンダードの MySQL
拡張子です。それは挿入、または
削除
と挿入を行います。挿入、または
更新 — を行うスタンダード
SQL — の別の MySQL 拡張子に関しては、
項12.2.4.3. 「INSERT ... ON DUPLICATE KEY UPDATE
構文」
を参照してください。
テーブルが PRIMARY KEY
か
UNIQUE
インデックスを持たなければ、REPLACE
ステートメントの利用は何の意味も持たないという事を覚えておいてください。新しい行が別の行を複製するかどうかを決める為に利用するインデックスが無い為、それは
INSERT
と同等になります。
全てのカラムの値は、REPLACE
ステートメントの中で指定された値から取られています。紛失したカラムは、INSERT
と同じように、デフォルト値に設定されます。現在の行から値を参照し、それらを新しい行の中で利用する事はできません。もし、SET
のような割り当てを利用すると、右側のカラム名の参照は
col_name
=
col_name
+ 1DEFAULT(
として扱われるので、その割り当ては col_name
)SET
と同等になります。
col_name
=
DEFAULT(col_name
) + 1
REPLACE
を利用する為には、テーブルに対して
INSERT
と DELETE
権限の両方を持つ必要があります。
REPLACE
ステートメントは、影響を受けた行数を表す為に総数を返します。これは、削除、挿入された行の総数です。もし単列
REPLACE
の総数が1であれば、行が1つ挿入され、削除された行はないという事になります。
もし総数が1よりも大きければ、新しい行が挿入される前に、1つまたはそれ以上の行が削除されたという事になります。もしテーブルが複数の固有インデックスを含んでいれば、単列が複数の古い行を置き換える事が可能であり、そして新しい行は異なる固有のインデックス内の異なる古い行に値を複製します。
影響を受けた行の総数によって、REPLACE
が行を追加しただけなのか、それとも行の置き換えも行ったのか、という事を簡単に知る事ができます。総数が1(追加された)か、それよりも大きい(置き換えが行われた)かを確認してください。
もしC API
を利用していれば、mysql_affected_rows()
関数を利用する事で、影響を受けた行の総数を得る事ができます。
現在は、サブクエリの中で1つのテーブルに置き換え、同じテーブルから選択する事はできません。
MySQL は次のアルゴリズムを REPLACE
(と LOAD DATA ...
REPLACE
)に利用します。
テーブルに新しい行の挿入を試みてください。
主キーか固有インデックスに複製キー エラーが起きた為に挿入に失敗したら:
複製キー値を持つ矛盾した行をテーブルから削除してください。
テーブルに新しい行の挿入をもう一度試みてください。