REPLACE [LOW_PRIORITY | DELAYED] [INTO] tbl_name [(col_name,...)] VALUES (expression,...),(...),... または REPLACE [LOW_PRIORITY | DELAYED] [INTO] tbl_name [(col_name,...)] SELECT ... または REPLACE [LOW_PRIORITY | DELAYED] [INTO] tbl_name SET col_name=expression, col_name=expression,...
REPLACE
は INSERT
とほぼ同じように動作しますが、唯一異なる点として、UNIQUE
インデックスまたは PRIMARY KEY
に関して新しいレコードと同じ値がテーブル内の以前のレコードに含まれていると、以前のレコードが削除されてから新しいレコードが挿入されます。
See 項6.4.3. 「INSERT
構文」。
つまり、REPLACE
ステートメントでは、以前からあるレコードの値にはアクセスできないことになります。一部の初期バージョンの
MySQL
では、このアクセスが可能のように見えましたが、これはバグであり、修正されました。
REPLACE
を使用するためには、対象のテーブルに対する
INSERT
権限と DELETE
権限が必要です。
REPLACE
コマンドの使用時、以前のレコード 1
つが新しいレコードで置き換えられると、mysql_affected_rows()
によって 2
が返されます。これは重複の削除後にレコードが
1 つ挿入されたためです。
これに基づき、影響されたレコードの値が
1(追加)と
2(置換)のどちらかチェックすることによって、REPLACE
によってレコードが 1
つ追加されたのか、または置き換えられたのかを簡単に判別できます。
注意: テーブルに UNIQUE
インデックスまたは PRIMARY KEY
が設定されていない場合、REPLACE
コマンドを使用しても意味がありません。この場合、新しいレコードが既存のものと重複しているかどうかの判別に使用するインデックスがないため、REPLACE
コマンドは INSERT
と同じになります。
以下は、使用されるアルゴリズムを詳細に示したものです(このアルゴリズムは
LOAD DATA ... REPLACE
でも使用されます)。
- Insert the row into the table - While duplicate key error for primary or unique key - Revert changed keys - Read conflicting row from the table through the duplicate key value - Delete conflicting row - Try again to insert the original primary key and unique keys in the tree
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.