15

MySQLのREPLACE INTO関数は、行を削除および挿入するように機能します。私のテーブルでは、主キー( )は自動インクリメントされるため、データベースの末尾にidあるテーブルを削除してから挿入することを期待していました。id

ただし、予期しないことを行い、同じように挿入しidます。これは予想される動作ですか、それともここで何かが欠けていますか?(ステートメントidを呼び出すときに設定していません)REPLACE INTO

4

2 に答える 2

14

UNIQUEこれは、テーブルに別のインデックスがある場合に予想される動作です。そうでない場合は、予想どおりに行が追加されます。ドキュメントを参照してください:

REPLACEはINSERTとまったく同じように機能しますが、テーブル内の古い行がPRIMARY KEYまたはUNIQUEインデックスの新しい行と同じ値である場合、新しい行が挿入される前に古い行が削除されます。13.2.5項「INSERT構文」を参照してください。

https://dev.mysql.com/doc/refman/5.5/en/replace.html

mySQLは他にどのように置換する行を見つけるのでしょうか?テーブル全体をスキャンすることしかできず、時間がかかります。これを示すためにSQLフィドルを作成しました。こちらをご覧ください

于 2012-08-30T20:55:13.673 に答える
3

これは予想される動作です。技術的には、置換/挿入されるデータのすべての一意のキー(主キーだけでなく)が既存の行と一致する場合、MySQLは実際に既存の行を削除し、同じ値を使用して置換データを含む新しい行を挿入しますすべての一意のキーに対して。したがって、このようなクエリで影響を受ける行の数を確認すると、置換ごとに2つの影響を受ける行が取得され、ストレート挿入の場合は1つだけ取得されます。

于 2012-08-30T20:48:38.660 に答える