REPLACE [LOW_PRIORITY | DELAYED] [INTO]tbl_name
[(col_name
,...)] {VALUES | VALUE} ({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
とまったく同じように機能します。項8.2.5. 「INSERT
構文」
を参照してください。
REPLACE
は SQL
スタンダードの MySQL
拡張子です。それは挿入、または
削除
と挿入を行います。挿入または更新のいずれかを行う、標準
SQL に対する別の MySQL
拡張機能については、項8.2.5.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
)
に利用します。
テーブルに新しい行の挿入を試みてください。
主キーか一意のインデックスに重複キーエラーが起きたために挿入に失敗したら:
重複キー値を持つ矛盾した行をテーブルから削除してください。
テーブルに新しい行の挿入をもう一度試みてください。