2012-02-13 16 views
5

申し訳ありませんが、本当に問題はありません。「REPLACE INTO」とINSERT [IF]

私のデータベースにはかなり小さいテーブルがありますが、わずか3カラムですが、成長する可能性があります。問題には2つの解決策がありますが、どちらか一方を使用する理由は不明です。

私はデータを持っています。データはデータベースに入っていてもいなくてもかまいません。これを解決する2つの方法。私はユニークなIDを持っているので、チェックするのは簡単です。私はすでにIDを持っているので、レコードが、データベースに存在し、そうでない場合、INSERT INTOデータベース

  • 使用REPLACE INTO場合

    1. チェック。

    私の質問は今です。どちらを使うのが良いですか。 2つの結果のいずれかを使用して長所と短所は何ですか?それとも良い結果がありますか?

    メモ:データはまったく同じなので、新しい値でレコードが更新されることはありません。従って、REPLACE INTOは既に存在するデータを挿入するでしょう。

  • +10

    注意: 'REPLACE INTO'は内部的に' DELETE'と 'INSERT'として実装されています。削除は通常の削除です。つまり、外部キーをチェックし、 'ON DELETE'節に従います。とにかく、代わりに 'INSERT INTO ... ON DUPLICATE KEY UPDATE ...'をしたいと思うでしょう。 – Charles

    +0

    しかし、ここでベストプラクティスは何ですか?また、なぜ –

    +2

    (同じ)(既存の)値で行を更新しようとすると、MySQLは値が同じであることを検出し、更新をスキップして時間、ロックなどを節約します。 INTO ... DUPLICATE KEY UPDATE ... 'と比較して、既存の行を最初に削除します。 –

    答えて

    10

    REPLACE INTOここではおすすめしません。何も交換する必要はありません。 に続いてINSERTが続き、すべての結果が得られます。たとえば、すべての索引を更新する必要があります。頻繁に使用すると、不要な作業や索引の断片化が発生します。

    一方、カウンタには主に使用されるON DUPLICATE KEY UPDATEがありますが、インクリメントやその他の値の変更で行を更新しないので、SET id=idなどの奇妙な構文を使用する必要があります。

    レコードはあなたのための最善の解決策になるデータベースに存在するかどうかの確認、代わりに別のクエリを使用すると、MySQLは、あなたとの使用のためにそのチェックをしましょう:

    `INSERT IGNORE INTO ...` 
    

    この方法で、あなたが挿入しようとする場合複製されたユニークキーまたはプライマリキーを持つ行は、エラーを生成することなく挿入されます。おそらく他のエラーメッセージが表示されないという副作用に注意してください。挿入した内容が分かっていれば、うまくいくはずです。