2011-01-04 31 views
153

Tôi có một bảng với một chìa khóa duy nhất cho hai cột:INSERT ... ON DUPLICATE KEY (không làm gì cả)

CREATE TABLE `xpo`.`user_permanent_gift` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT , 
`fb_user_id` INT UNSIGNED NOT NULL , 
`gift_id` INT UNSIGNED NOT NULL , 
`purchase_timestamp` TIMESTAMP NULL DEFAULT now() , 
PRIMARY KEY (`id`) , 
UNIQUE INDEX `user_gift_UNIQUE` (`fb_user_id` ASC, `gift_id` ASC)); 

Tôi muốn chèn một hàng vào bảng đó, nhưng nếu phím tồn tại, để không làm gì cả! Tôi không muốn một lỗi được tạo ra bởi vì các khóa tồn tại.

Tôi biết rằng có cú pháp sau:

INSERT ... ON DUPLICATE KEY UPDATE ... 

nhưng là có cái gì đó như:

INSERT ... ON DUPLICATE KEY DO NOTHING 

?

Trả lời

256

Có, có INSERT IGNORE hoặc bạn có thể làm ON DUPLICATE KEY UPDATE id=id.

+3

chỉ để thêm IGNORE sau khi INSERT, phần còn lại của cú pháp là như nhau? – ufk

+19

@ufk: 'INSERT IGNORE' không có phần' ON DUPLICATE KEY', ví dụ: 'INSERT IGNORE INTO xpo.user_permanent_gift (...) VALUES (...)' – BoltClock

+95

Lưu ý rằng INSERT IGNORE cũng bỏ qua các lỗi khác như lỗi chuyển đổi dữ liệu. – mjcopple

0

Theo như tôi biết, không thực sự có.

UPDATE IGNORE cũng bỏ qua bất kỳ lỗi nào khác mà tôi nghĩ là rất nguy hiểm.

Những gì tôi (không có thể là điều tốt nhất để làm) là triển khai cú pháp CẬP NHẬT với một tuyên bố UPDATE "vô hại" như vậy:

INSERT INTO mytable (id, ...) VALUES (4, ...) ON DUPLICATE KEY UPDATE id=4; 

Rõ ràng, điều này có ghi không cần thiết I/O, nhưng cho tôi điều này đã làm việc tốt cho đến nay.

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