33

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つのステートメントを組み合わせる方法を知っている人はいますか?それ以外の場合は既存のレコードを更新しますか?

4

6 に答える 6

47

MySQLは、insert-on-duplicate構文feをサポートしています。

INSERT INTO table (key,col1) VALUES (1,2)
  ON DUPLICATE KEY UPDATE col1 = 2;
于 2009-12-23T13:52:34.677 に答える
13

テーブルに確実な制約がある場合は、そのためにREPLACE INTOforを使用することもできます。これがMySQLからの引用です:

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

構文は基本的にと同じですが、。INSERT INTOに置き換えINSERTREPLACEください。

INSERT INTO messages (sender, sent_time, status) VALUES (@sender, time, @status)

その後、

REPLACE INTO messages (sender, sent_time, status) VALUES (@sender, time, @status)

これはMySQL固有のコマンドであり、他のDBでは発生しないため、移植性に注意してください。

于 2009-12-23T14:52:43.047 に答える
3

他の人が述べているように、「upsert」と呼ばれることもある「insert ...onduplicatekeyupdate」を使用する必要があります。ただし、特定のケースでは、更新で静的な値を使用するのではなく、挿入ステートメントの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);
于 2009-12-23T14:42:25.333 に答える
2

「重複キー更新の挿入」を確認してください。

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;
于 2009-12-23T13:51:28.857 に答える
1

1つのオプションは、重複する更新構文で使用することです

http://dev.mysql.com/doc/refman/5.1/en/insert-on-duplicate.html

他のオプションは、レコードが存在するかどうかを判断するためにselectを実行し、それに応じて挿入/更新を実行します。トランザクションselectを使用している場合、トランザクションを明示的に終了しないため、安全に使用できます。

于 2009-12-23T13:53:34.000 に答える
-1
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);
于 2013-07-05T12:48:16.180 に答える