CHỨNG CHỈ TRÊN KHÓA DUPLICATE (không làm gì)


184

Tôi có một bảng với một khóa duy nhất cho hai cột:

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 khóa tồn tại, không làm gì cả! Tôi không muốn tạo ra lỗ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 có một cái gì đó như:

INSERT ... ON DUPLICATE KEY DO NOTHING 

?

Câu trả lời:


331

Có, sử dụng INSERT ... ON DUPLICATE KEY UPDATE id=id(nó sẽ không kích hoạt cập nhật hàng ngay cả khi idđược gán cho chính nó).

Nếu bạn không quan tâm đến lỗi (lỗi chuyển đổi, lỗi khóa ngoài) và cạn kiệt trường tự động (nó tăng ngay cả khi hàng không được chèn do khóa trùng lặp), sau đó sử dụng INSERT IGNORE.


5
chỉ cần thêm IGNORE sau INSERT, phần còn lại của cú pháp có giống nhau không?
ufk

25
@ufk: INSERT IGNOREmà không ON DUPLICATE KEYmột phần, ví dụ:INSERT IGNORE INTO xpo.user_permanent_gift (...) VALUES (...)
BoltClock

125
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

36
vì vậy tôi sẽ sử dụng ON DUPLICATE KEY UPDATE id = id. tôi chỉ muốn bỏ qua các bản sao chính chứ không phải bất kỳ loại lỗi nào khác.
ufk

7
hãy cẩn thận INSERT IGNORE sẽ tăng cột tăng tự động ngay cả khi hàng không được chèn
WorM

9

LÀM THẾ NÀO ĐỂ THỰC HIỆN 'chèn nếu không tồn tại'?

1. REPLACE INTO

ưu:

  1. đơn giản.

Nhược điểm:

  1. quá chậm.

  2. Khóa tăng tự động sẽ THAY ĐỔI (tăng thêm 1) nếu có mục khớp unique keyhoặc primary keybởi vì nó xóa mục cũ sau đó chèn mục mới.

2. INSERT IGNORE

ưu:

  1. đơn giản.

Nhược điểm:

  1. chìa khóa tự động tăng sẽ không thay đổi nếu có trận đấu entry unique keyhay primary keynhưng chỉ số tự động tăng sẽ tăng thêm 1

  2. một số lỗi / cảnh báo khác sẽ bị bỏ qua như lỗi chuyển đổi dữ liệu.

3. INSERT ... ON DUPLICATE KEY UPDATE

ưu:

  1. bạn có thể dễ dàng thực hiện chức năng 'lưu hoặc cập nhật' với điều này

Nhược điểm:

  1. trông tương đối phức tạp nếu bạn chỉ muốn chèn không cập nhật.

  2. chìa khóa tự động tăng sẽ không thay đổi nếu có trận đấu entry unique keyhay primary keynhưng chỉ số tự động tăng sẽ tăng thêm 1

4. Bất kỳ cách nào để dừng khóa tăng tự động tăng nếu có mục nhập phù hợp unique keyhoặc primary key?

Như được đề cập trong bình luận dưới đây của @toien: "cột tăng tự động sẽ được thực hiện tùy thuộc vào innodb_autoinc_lock_modecấu hình sau phiên bản 5.1" nếu bạn đang sử dụng innodblàm công cụ của mình, nhưng điều này cũng ảnh hưởng đến sự tương tranh, vì vậy nó cần được xem xét kỹ trước khi sử dụng. Cho đến nay tôi không thấy giải pháp nào tốt hơn.


auto-increment cột sẽ được thực hiện phụ thuộc vào innodb_autoinc_lock_modecấu hình sau khi phiên bản 5.1
toien

1

Sử dụng ON DUPLICATE KEY UPDATE ...,
phủ định: bởi vì UPDATEsử dụng tài nguyên cho hành động thứ hai.

Sử dụng INSERT IGNORE ...,
phủ định: MySQL sẽ không hiển thị bất kỳ lỗi nào nếu có lỗi xảy ra, do đó bạn không thể xử lý các lỗi. Chỉ sử dụng nó nếu bạn không quan tâm đến truy vấn.


@abdul có hỗ trợ mysql gì bạn giải thích ở đây không?
Lalit Tarsariya
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.