列のあるテーブルがありますrecord_id
(auto inc)、sender
、sent_time
およびstatus
。
「sender1」など、特定の送信者のレコードがない場合は、新しいレコードを挿入する必要があります。それ以外の場合は、「user1」に属する既存のレコードを更新する必要があります。
そのため、すでに保存されているレコードがない場合、私は実行します
# record_id is AUTO_INCREMENT field
INSERT INTO messages (sender, sent_time, status)
VALUES (@sender, time, @status)
それ以外の場合は、UPDATEステートメントを実行します。
とにかく、フィールド送信者の値が「user1」であるレコードがない場合に新しいレコードを挿入するためにこれらの2つのステートメントを組み合わせる方法を誰かが知っていますか。それ以外の場合は既存のレコードを更新しますか?
MySQLは insert-on-duplicate 構文をサポートしています。
INSERT INTO table (key,col1) VALUES (1,2)
ON DUPLICATE KEY UPDATE col1 = 2;
テーブルにしっかりとした制約がある場合は、 REPLACE INTO
を使用することもできます。 MySQLからの引用は次のとおりです。
REPLACEはINSERTとまったく同じように機能しますが、テーブルの古い行がPRIMARY KEYまたはUNIQUEインデックスの新しい行と同じ値を持つ場合、古い行は新しい行の前に削除されます。挿入されます。
構文は基本的にINSERT INTO
と同じですが、INSERT
をREPLACE
に置き換えるだけです。
INSERT INTO messages (sender, sent_time, status) VALUES (@sender, time, @status)
その後、
REPLACE INTO messages (sender, sent_time, status) VALUES (@sender, time, @status)
これはMySQL固有のコマンドであり、他のDBでは発生しないことに注意してください。移植性に注意してください。
他の人が述べたように、「重複キー更新の挿入...」を使用する必要があります。「アップサート」と呼ばれることもあります。ただし、特定のケースでは、更新で静的な値を使用するのではなく、insertステートメントのvalues句に渡す値を使用します。
具体的には、行がすでに存在する場合、2つの列を更新したいと思います。
1) sent_time
2) status
これを行うには、次のような "upsert"ステートメントを使用します(例を使用)。
INSERT INTO messages (sender, sent_time, status)
VALUES (@sender, time, @status)
ON DUPLICATE KEY UPDATE
sent_time = values(sent_time),
status = values(status);
チェックアウト "Insert on Duplicate Key Update" 。
INSERT INTO table (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=c+1;
UPDATE table SET c=c+1 WHERE a=1;
1つのオプションは、重複する更新構文で使用することです
http://dev.mysql.com/doc/refman/5.1/en/insert-on-duplicate.html
他のオプションは、レコードが存在するかどうかを判断するために選択を行い、それに応じて挿入/更新を行います。トランザクションを使用していない場合、selectは明示的にトランザクションを終了しないため、安全に使用できます。
use merge statement :
merge into T1
using T2
on (T1.ID = T2.ID)
when matched
then update set
T1.Name = T2.Name
when not matched
then insert values (T2.ID,T2.Name);