存在する場合はどのように更新し、存在しない場合(別名「upsert」または「merge」)をMySQLに挿入しますか?

StackOverflow https://stackoverflow.com/questions/1218905

質問

1つのMySQLクエリを使用して、行が存在しないときに INSERT 、または存在する場合に UPDATE する簡単な方法はありますか?

役に立ちましたか?

解決

はい、 INSERT ... ON重複キーの更新 。例:

INSERT INTO `usage`
(`thing_id`, `times_used`, `first_time_used`)
VALUES
(4815162342, 1, NOW())
ON DUPLICATE KEY UPDATE
`times_used` = `times_used` + 1

他のヒント

これは古い質問ですが、最近Googleが私をここに導いてくれたので、他の人もここに来ると思います。

@chaosは正しい: < code> INSERT ... ON DUPLICATE KEY UPDATE 構文。

ただし、元々の質問はMySQLについて具体的に尋ねたもので、MySQLには REPLACE INTO ... 構文。私見、このコマンドはアップサートに使用する方が簡単で簡単です。マニュアルから:

  

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

これは標準SQLではないことに注意してください。マニュアルの例:

CREATE TABLE test (
  id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  data VARCHAR(64) DEFAULT NULL,
  ts TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (id)
);

mysql> REPLACE INTO test VALUES (1, 'Old', '2014-08-20 18:47:00');
Query OK, 1 row affected (0.04 sec)

mysql> REPLACE INTO test VALUES (1, 'New', '2014-08-20 18:47:42');
Query OK, 2 rows affected (0.04 sec)

mysql> SELECT * FROM test;
+----+------+---------------------+
| id | data | ts                  |
+----+------+---------------------+
|  1 | New  | 2014-08-20 18:47:42 |
+----+------+---------------------+
1 row in set (0.00 sec)

編集: REPLACE INTO UPDATE とは異なるという公正な警告です。マニュアルにあるように、 REPLACE は行が存在する場合は削除し、新しい行を挿入します。 (上記の例では、面白い「2行の影響」に注意してください。)つまり、既存のレコードの all 列の値を置き換えます(単に some 列。)MySQLの REPLACE INTO の動作は、Sqliteの INSERT OR REPLACE INTO の動作によく似ています。いくつかの列のみを更新する場合の回避策については、この質問をご覧ください(すべての列ではありません)レコードが既に存在する場合。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top