MySQLのREPLACE INTO
関数は、行を削除および挿入するように機能します。私のテーブルでは、主キー( )は自動インクリメントされるため、データベースの末尾にid
あるテーブルを削除してから挿入することを期待していました。id
ただし、予期しないことを行い、同じように挿入しid
ます。これは予想される動作ですか、それともここで何かが欠けていますか?(ステートメントid
を呼び出すときに設定していません)REPLACE INTO
MySQLのREPLACE INTO
関数は、行を削除および挿入するように機能します。私のテーブルでは、主キー( )は自動インクリメントされるため、データベースの末尾にid
あるテーブルを削除してから挿入することを期待していました。id
ただし、予期しないことを行い、同じように挿入しid
ます。これは予想される動作ですか、それともここで何かが欠けていますか?(ステートメントid
を呼び出すときに設定していません)REPLACE INTO
UNIQUE
これは、テーブルに別のインデックスがある場合に予想される動作です。そうでない場合は、予想どおりに行が追加されます。ドキュメントを参照してください:
REPLACEはINSERTとまったく同じように機能しますが、テーブル内の古い行がPRIMARY KEYまたはUNIQUEインデックスの新しい行と同じ値である場合、新しい行が挿入される前に古い行が削除されます。13.2.5項「INSERT構文」を参照してください。
https://dev.mysql.com/doc/refman/5.5/en/replace.html
mySQLは他にどのように置換する行を見つけるのでしょうか?テーブル全体をスキャンすることしかできず、時間がかかります。これを示すためにSQLフィドルを作成しました。こちらをご覧ください
これは予想される動作です。技術的には、置換/挿入されるデータのすべての一意のキー(主キーだけでなく)が既存の行と一致する場合、MySQLは実際に既存の行を削除し、同じ値を使用して置換データを含む新しい行を挿入しますすべての一意のキーに対して。したがって、このようなクエリで影響を受ける行の数を確認すると、置換ごとに2つの影響を受ける行が取得され、ストレート挿入の場合は1つだけ取得されます。