Jawaban:
Gunakan INSERT ... ON DUPLICATE KEY UPDATE
. Sebagai contoh:
INSERT INTO `usage`
(`thing_id`, `times_used`, `first_time_used`)
VALUES
(4815162342, 1, NOW())
ON DUPLICATE KEY UPDATE
`times_used` = `times_used` + 1
geb
dan topic
itu akan berfungsi ( ALTER TABLE table ADD UNIQUE geb_by_topic (geb, topic)
).
MERGE
tapi saya tidak yakin apakah sintaksnya identik dengan SQL Server.
NULL
, untuk membiarkan auto_increment
perilaku berfungsi (yang sebaliknya, ya, berfungsi seperti yang Anda duga ; lihat dev.mysql.com/doc/refman/5.5/en/example-auto-increment. html ).
VALUES(col)
untuk mendapatkan nilai dari argumen insert jika ada duplikat. Contoh:ON DUPLICATE UPDATE b = VALUES(b), c = VALUES(c)
Saya tahu ini adalah pertanyaan lama, tetapi Google membawa saya ke sini baru-baru ini, jadi saya membayangkan orang lain juga datang ke sini.
@chaos benar: ada INSERT ... ON DUPLICATE KEY UPDATE
sintaksnya.
Namun, pertanyaan awal ditanyakan tentang MySQL secara khusus, dan di MySQL ada REPLACE INTO ...
sintaksisnya. IMHO, perintah ini lebih mudah dan lebih mudah digunakan untuk upert. Dari manual:
REPLACE bekerja persis seperti INSERT, kecuali bahwa jika baris lama dalam tabel memiliki nilai yang sama dengan baris baru untuk KUNCI UTAMA atau indeks UNIK, baris lama dihapus sebelum baris baru dimasukkan.
Perhatikan ini bukan SQL standar. Contoh dari manual:
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)
Sunting: Hanya peringatan wajar yang REPLACE INTO
tidak disukai UPDATE
. Seperti yang dikatakan manual, REPLACE
hapus baris jika ada, lalu sisipkan yang baru. (Catat lucu "2 baris yang terpengaruh" dalam contoh di atas.) Artinya, itu akan menggantikan nilai semua kolom dari catatan yang ada (dan tidak hanya memperbarui beberapa kolom.) Perilaku MySQL REPLACE INTO
mirip dengan Sqlite INSERT OR REPLACE INTO
. Lihat pertanyaan ini untuk beberapa solusi jika Anda hanya ingin memperbarui beberapa kolom (dan tidak semua kolom) jika catatan sudah ada.
MERGE
. Secara umum, konsep ini sering disebut sebagai"UPSERT"
.