Câu trả lời:
Sử dụng INSERT ... ON DUPLICATE KEY UPDATE
. Ví dụ:
INSERT INTO `usage`
(`thing_id`, `times_used`, `first_time_used`)
VALUES
(4815162342, 1, NOW())
ON DUPLICATE KEY UPDATE
`times_used` = `times_used` + 1
geb
và topic
nó sẽ hoạt động ( ALTER TABLE table ADD UNIQUE geb_by_topic (geb, topic)
).
MERGE
nhưng tôi không chắc cú pháp của nó có giống với SQL Server không.
NULL
, để cho phép auto_increment
hành vi hoạt động (nếu không, vâng, hoạt động như bạn đoán, xem dev.mysql.com/doc/refman/5.5/en/example-auto-increment. html ).
VALUES(col)
để lấy giá trị từ đối số chèn trong trường hợp trùng lặp. Ví dụ:ON DUPLICATE UPDATE b = VALUES(b), c = VALUES(c)
Tôi biết đây là một câu hỏi cũ, nhưng Google dẫn tôi đến đây gần đây vì vậy tôi tưởng tượng những người khác cũng đến đây.
@chaos đúng: có INSERT ... ON DUPLICATE KEY UPDATE
cú pháp.
Tuy nhiên, câu hỏi ban đầu hỏi về MySQL cụ thể và trong MySQL có REPLACE INTO ...
cú pháp. IMHO, lệnh này dễ dàng hơn và đơn giản hơn để sử dụng cho uperts. Từ hướng dẫn:
REPLACE hoạt động chính xác như INSERT, ngoại trừ nếu một hàng cũ trong bảng có cùng giá trị với một hàng mới cho KEY PRIMARY hoặc chỉ mục UNIQUE, hàng cũ sẽ bị xóa trước khi hàng mới được chèn.
Lưu ý đây không phải là SQL chuẩn. Một ví dụ từ hướng dẫn:
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)
Chỉnh sửa: Chỉ là một cảnh báo công bằng mà REPLACE INTO
không thích UPDATE
. Như hướng dẫn nói, REPLACE
xóa hàng nếu nó tồn tại, sau đó chèn một hàng mới. (Lưu ý funny "2 rows affected" trong ví dụ trên). Nghĩa là, nó sẽ thay thế các giá trị của tất cả các cột của một kỷ lục hiện có (và không chỉ đơn thuần là cập nhật một số cột.) Hành vi của MySQL REPLACE INTO
là giống như là của Sqlite của INSERT OR REPLACE INTO
. Xem câu hỏi này cho một số cách giải quyết nếu bạn chỉ muốn cập nhật một vài cột (và không phải tất cả các cột) nếu bản ghi đã tồn tại.
MERGE
. Nói chung, khái niệm thường được gọi là"UPSERT"
.