Sử dụng INSERT IGNORE INTO table
.
Ngoài ra còn có INSERT … ON DUPLICATE KEY UPDATE
cú pháp và bạn có thể tìm giải thích trong 13.2.6.2 CHÈN ... TRÊN Tuyên bố CẬP NHẬT KHÓA DUPLICATE
.
Đăng từ bogdan.org.ua theo bộ nhớ cache của Google :
Ngày 18 tháng 10 năm 2007
Để bắt đầu:kể từ MySQL mới nhất, cú pháp được trình bày trong tiêu đề là không thể thay đổi. Nhưng có một số cách rất dễ dàng để thực hiện những gì mong đợi bằng cách sử dụng chức năng hiện có.
Có 3 giải pháp khả thi:sử dụng INSERT IGNORE, REPLACE, orINSERT… ON DUPLICATE KEY UPDATE.
Hãy tưởng tượng chúng ta có một bảng:
CREATE TABLE `transcripts` ( `ensembl_transcript_id` varchar(20) NOT NULL, `transcript_chrom_start` int(10) unsigned NOT NULL, `transcript_chrom_end` int(10) unsigned NOT NULL, PRIMARY KEY (`ensembl_transcript_id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Bây giờ, hãy tưởng tượng rằng chúng ta có một đường ống tự động nhập dữ liệu transcripttsmeta từ Ensembl và do nhiều lý do mà đường ống có thể bị hỏng ở bất kỳ bước thực thi nào. Do đó, chúng ta cần đảm bảo sự phân nhánh:
- việc thực thi lặp đi lặp lại quy trình sẽ không phá hủy> cơ sở dữ liệu của chúng tôi
- các lần thực thi lặp lại sẽ không bị chết do lỗi "trùng lặp> khóa chính".
Phương pháp 1:sử dụng REPLACE
Nó rất đơn giản:
REPLACE INTO `transcripts` SET `ensembl_transcript_id` = 'ENSORGT00000000001', `transcript_chrom_start` = 12345, `transcript_chrom_end` = 12678;
Nếu bản ghi tồn tại, nó sẽ bị ghi đè; nếu nó chưa tồn tại, nó sẽ được tạo. Tuy nhiên, sử dụng phương pháp này không hiệu quả đối với trường hợp của chúng tôi:chúng tôi không cần ghi đè các bản ghi hiện có, chỉ cần bỏ qua chúng là được.
Phương pháp 2:sử dụng CHÈN BỎ QUA Cũng rất đơn giản:
INSERT IGNORE INTO `transcripts` SET `ensembl_transcript_id` = 'ENSORGT00000000001', `transcript_chrom_start` = 12345, `transcript_chrom_end` = 12678;
Ở đây, nếu ‘ensembl_transcript_id’ đã có trong cơ sở dữ liệu, nó sẽ bị bỏ qua một cách âm thầm (bỏ qua). (Nói chính xác hơn, đây là trích dẫn từ hướng dẫn sử dụng tham chiếu MySQL:“Nếu bạn sử dụng từ khóa BỎ QUA, các lỗi xảy ra trong khi thực thi câu lệnh INSERT thay vào đó được coi là cảnh báo. Ví dụ:không có BỎ QUA, một hàng mô phỏng chỉ mục DUY NHẤT hiện có hoặc TỪ KHÓA CHÍNH giá trị trong bảng gặp lỗi khóa trùng lặp và câu lệnh bị hủy bỏ. ”.) Nếu không có từ khóa nào, nó sẽ được tạo.
Phương pháp thứ hai này có một số điểm yếu tiềm ẩn, bao gồm cả việc không loại bỏ truy vấn trong trường hợp có bất kỳ sự cố nào khác xảy ra (xem thường niên). Vì vậy, nó sẽ được sử dụng nếu đã thử nghiệm trước đó mà không có từ khóaIGNORE.
Phương pháp 3:sử dụng CHÈN… TRÊN CẬP NHẬT KHÓA DUPLICATE:
Tùy chọn thứ ba là sử dụng
INSERT … ON DUPLICATE KEY UPDATE
cú pháp và trong phần CẬP NHẬT chỉ cần thực hiện một số thao tác vô nghĩa (trống), chẳng hạn như tính toán 0 + 0 (Geoffray đề xuất thực hiện gán theid =id cho công cụ tối ưu hóa MySQL để bỏ qua thao tác này). Ưu điểm của phương pháp này là nó chỉ bỏ qua các sự kiện trùng lặp và vẫn bỏ qua các lỗi khác.Như một thông báo cuối cùng:bài đăng này được lấy cảm hứng từ Xaprb. Tôi cũng khuyên bạn nên tham khảo bài đăng khác của anh ấy về cách viết các truy vấn SQL linh hoạt.