web-dev-qa-db-ja.com

SQLでの置換と挿入

次のSQLチュートリアルを実行しています: http://sql.learncodethehardway.org/book/ex11.html

この演習では、著者は2番目の段落で次のように述べています。

この状況では、レコードを別の男に置き換えますが、一意のIDを保持します。問題は、トランザクションでDELETE/INSERTを実行してアトミックにするか、完全なUPDATEを実行する必要があることです。

誰かが私にUPDATEを行うことの問題を説明できますか?whenUPDATEの代わりにREPLACEを選択するかもしれませんか?

更新コード:

UPDATE person SET first_name = "Frank", last_name = "Smith", age = 100
    WHERE id = 0;

REPLACEコードは次のとおりです。

REPLACE INTO person (id, first_name, last_name, age)
    VALUES (0, 'Frank', 'Smith', 100);

編集:私が持っている別の質問は、引用されたセクションで説明されているように、なぜUPDATEだけでなくDELETE/INSERTを行うのでしょうか?

16
jcm

ドキュメント によると、違いは次のとおりです。

REPLACEはINSERTとまったく同じように機能しますが、テーブル内の古い行がPRIMARY KEYまたはUNIQUEインデックスの新しい行と同じ値を持つ場合、新しい行が挿入される前に古い行が削除されます。

それが何をするのか:

  • 使用可能なインデックスのいずれかを使用して行を一致させてください。
  • 行がまだ存在しない場合:新しい行を追加します。
  • 行が既に存在する場合:既存の行を削除し、後で新しい行を追加します。

これを使用すると、別々のinsertおよびupdateステートメントで役立つ場合がありますか?

  • これを安全に呼び出すことができ、既存の行を心配する必要はありません(1つのステートメントと2つのステートメント)。
  • inserting/updatingのときに関連データを削除する場合は、replaceを使用できます。関連データもすべて削除されます)。
  • トリガーを起動する必要があり、insert(悪い理由、大丈夫)を期待する場合。
18
Patrick Hofman

First Replaceは、すべてのデータベースエンジンで広く理解されているわけではありません。

次に、主キーに基づいてレコードを挿入/更新します。更新では、より複雑な条件を指定できます:

UPDATE person SET first_name = 'old ' + first_name WHERE age > 50

また、UPDATEはレコードを作成しません。

3
FooLman

更新は、特定の条件に基づいてテーブル内の既存のレコード値を変更します。したがって、1つのクエリで1つまたは複数のレコードを変更できます。

レコードがテーブルに存在しない場合、InsertまたはReplaceは新しいレコードを挿入し、それ以外の場合は置換します。 置換クエリは、挿入または置換クエリで主キー値を指定した場合にのみ機能します。主キーフィールド値を追加することを忘れると、テーブルに新しいレコードが作成されます。

事例:-

更新:列の値を使用する式に基づいて行われる賃金の計算があります。この場合、単一のクエリを使用して複数のレコードを更新できるため、常に更新クエリを使用します。

挿入または置換:共有したリンクで既に言及されています。

1
Rajen Raiyarela

行が存在しない場合、UPDATEは効果がありません。

行が存在しない場合はINSERTまたはREPLACEが挿入するか、存在する場合は値を置き換えます。