Hành vi này được ghi lại (đoạn trong ngoặc đơn):
Nếu bạn chỉ định CẬP NHẬT KHÓA DUPLICATE và một hàng được chèn có thể gây ra giá trị trùng lặp trong chỉ mục DUY NHẤT hoặc KHÓA CHÍNH, MySQL sẽ thực hiện một CẬP NHẬT của hàng cũ. Ví dụ:nếu cột a được khai báo là UNIQUE và chứa giá trị 1, hai câu lệnh sau có tác dụng tương tự:
INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=c+1; UPDATE table SET c=c+1 WHERE a=1;
(Các hiệu ứng không giống với bảng InnoDB foran trong đó a là cột tăng tự động. Với cột tăng tự động, câu lệnh INSERT tăng giá trị tự động tăng nhưng UPDATE thì không.)
Đây là một lời giải thích đơn giản. MySQL cố gắng thực hiện việc chèn trước. Đây là khi id được tự động tăng lên. Sau khi tăng lên, nó sẽ ở lại. Sau đó, bản sao được phát hiện và cập nhật sẽ xảy ra. Nhưng giá trị bị bỏ lỡ.
Bạn không nên phụ thuộc vào auto_increment
không có khoảng trống. Nếu đó là một yêu cầu, chi phí cho các bản cập nhật và phụ trang sẽ lớn hơn nhiều. Về cơ bản, bạn cần phải đặt một ổ khóa trên toàn bộ bàn và đánh số lại mọi thứ cần đánh số lại, điển hình là sử dụng trình kích hoạt. Một giải pháp tốt hơn là tính toán các giá trị gia tăng trên đầu ra.