2009-08-02 52 views

Trả lời

184

Có, 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 
+0

Thật tuyệt vời. Các RDMS khác có tính năng này không? –

+10

Vâng, tôi tin rằng tương đương của SQL Server được gọi là 'MERGE'. Nói chung, khái niệm này thường được gọi là "UPSERT". – chaos

+0

Nhưng điều này không hoạt động khi không có sẵn. Bảng của tôi trông giống như sau: geb | chủ đề | đã truy cập Tôi muốn chèn bảng INSERT INTO SET đã truy cập = NOW(), geb = 1, topic = 1 Nhưng nếu đã có sự kết hợp của geb = 1 && topic = 1 thì nó sẽ cập nhật hàng thay vì chèn một cái mới. – blub

2

Tôi biết đây là câu hỏi cũ nhưng Google dẫn tôi đến đây gần đây để tôi tưởng tượng người khác cũng đến đây.

@chaos là chính xác: có cú pháp INSERT ... ON DUPLICATE KEY UPDATE.

Tuy nhiên, câu hỏi ban đầu được hỏi về MySQL cụ thể và trong MySQL có cú pháp REPLACE INTO .... IMHO, lệnh này dễ sử dụng hơn và đơn giản hơn để sử dụng cho upserts. Từ hướng dẫn sử dụng:

THAY THẾ hoạt động chính xác như INSERT, ngoại trừ nếu hàng cũ trong bảng có cùng giá trị như hàng mới cho khóa CHÍNH hoặc chỉ số UNIQUE, hàng cũ bị xóa trước mới hàng được chèn vào.

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) 

Edit: Chỉ cần một lời cảnh báo công bằng mà REPLACE INTO không giống như UPDATE. Như hướng dẫn sử dụng 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 ý "2 hàng bị ảnh hưởng" hài hước trong ví dụ trên.) Tức là, nó sẽ thay thế các giá trị của tất cả các cột của một bản ghi hiện có (và không chỉ cập nhật một số cột.) Hành vi của REPLACE INTO của MySQL giống như của Sqlite INSERT OR REPLACE INTO. Xem this question để biết 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.

Các vấn đề liên quan