Có cách nào dễ dàng để INSERT
một hàng khi nó không tồn tại hoặc UPDATE
nếu nó tồn tại, sử dụng một truy vấn MySQL?Làm thế nào để cập nhật nếu tồn tại, chèn nếu không (AKA "upsert" hoặc "hợp nhất") trong MySQL?
Trả lời
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
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.
- 1. oracle sql: cập nhật nếu tồn tại khác chèn
- 2. Cách nhanh nhất để cập nhật bảng MySQL nếu hàng tồn tại khác chèn. Hơn 2 phím không duy nhất
- 3. MySQL: Chèn nếu khóa ngoài tồn tại
- 4. Truy vấn SQL này cập nhật một hàng nếu tồn tại, hoặc chèn nếu không, làm việc?
- 5. SQLAlchemy cập nhật nếu khóa duy nhất tồn tại
- 6. NẾU KHÔNG tồn tại trong câu lệnh Hợp nhất?
- 7. Câu hỏi SQL ANSI - cách chèn hoặc cập nhật bản ghi nếu nó đã tồn tại?
- 8. Chèn hoặc cập nhật nếu kỷ lục là trong bảng
- 9. Tạo mô hình Django hoặc cập nhật nếu tồn tại
- 10. Postgresql, cập nhật nếu hàng có một số giá trị duy nhất tồn tại, hãy chèn
- 11. triển khai "cập nhật nếu tồn tại" trong Doctrine ORM
- 12. Nếu tồn tại hoặc tồn tại?
- 13. Tạo nếu mục nhập không tồn tại, nếu không cập nhật?
- 14. sql - chèn nếu không tồn tại
- 15. MongoDB nguyên tử "findOrCreate": findOne, chèn nếu không tồn tại, nhưng không cập nhật
- 16. Elasticsearch Cập nhật API nếu một lĩnh vực không tồn tại
- 17. Nếu bản ghi tồn tại, hãy cập nhật phần khác Chèn
- 18. làm thế nào để nói thủ tục tạo nếu không tồn tại trong MySQL
- 19. Cách tốt hơn để tạo liên kết has_one hoặc cập nhật nếu nó tồn tại
- 20. chèn nếu không tồn tại khác chỉ cần chọn trong mysql
- 21. SQL Server CE: nếu có cập nhật khác, hãy chèn
- 22. Chọn SQL: Cập nhật nếu có, Chèn nếu không - Với so sánh một phần ngày?
- 23. chèn có điều kiện sql nếu hàng không tồn tại
- 24. cập nhật mysql với điều kiện nếu
- 25. LINQ to SQL chèn-nếu-không tồn tại
- 26. Cách tốt nhất để kiểm tra nếu một hàng tồn tại trong bảng MySQL
- 27. Chèn SQL bản ghi nếu không tồn tại
- 28. PostgreSQL tạo bảng nếu không tồn tại
- 29. Trong Cypher, làm thế nào tôi có thể tạo mối quan hệ nếu nó không tồn tại; cập nhật thuộc tính nếu nó
- 30. Kiểm tra nhanh nhất nếu hàng tồn tại trong PostgreSQL
Thật tuyệt vời. Các RDMS khác có tính năng này không? –
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
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