Hành vi auto_increment mặc định trong MySQL 5.1 trở lên sẽ "mất" các giá trị tự động tăng nếu INSERT không thành công. Nghĩa là, nó tăng lên 1 mỗi lần, nhưng không hoàn tác một gia số nếu INSERT không thành công. Việc mất ~ 750 giá trị là không phổ biến nhưng không phải là không thể (tôi đã tham khảo ý kiến của một trang web đang bỏ qua 1500 giá trị cho mỗi lần CHÈN thành công).
Bạn có thể thay đổi innodb_autoinc_lock_mode=0
để sử dụng hành vi MySQL 5.0 và tránh mất giá trị trong một số trường hợp. Xem http://dev.mysql. com / doc / refman / 5.1 / en / innodb-auto-increment-processing.html
để biết thêm chi tiết.
Một điều khác cần kiểm tra là giá trị của auto_increment_increment
biến cấu hình. Đó là 1 theo mặc định, nhưng bạn có thể đã thay đổi điều này. Một lần nữa, rất hiếm khi đặt nó thành cao hơn 1 hoặc 2, nhưng có thể.
Tôi đồng ý với những người bình luận khác, các cột autoinc được dự định là duy nhất, nhưng không nhất thiết phải liên tiếp. Bạn có thể không nên lo lắng về điều đó quá nhiều trừ khi bạn đang tăng giá trị autoinc nhanh đến mức bạn có thể chạy ra khỏi phạm vi của INT (điều này đã xảy ra với tôi).
Chính xác thì bạn đã sửa nó như thế nào khi bỏ qua 1500 để không bao giờ chèn?
Nguyên nhân của INSERT không thành công là có một cột khác có ràng buộc DUY NHẤT trên đó và INSERT đang cố gắng chèn các giá trị trùng lặp vào cột đó. Đọc trang hướng dẫn mà tôi đã liên kết đến để biết chi tiết về lý do tại sao điều này lại quan trọng.
Cách khắc phục là thực hiện CHỌN trước để kiểm tra sự tồn tại của giá trị trước khi cố gắng CHÈN nó. Điều này đi ngược lại sự hiểu biết thông thường, đó là chỉ thử INSERT và xử lý bất kỳ ngoại lệ khóa trùng lặp nào. Nhưng trong trường hợp này, tác dụng phụ của INSERT không thành công đã làm mất giá trị auto-inc. Việc thực hiện SELECT đầu tiên đã loại bỏ hầu hết tất cả các trường hợp ngoại lệ như vậy.
Nhưng bạn cũng phải xử lý một ngoại lệ có thể xảy ra, ngay cả khi bạn CHỌN trước. Bạn vẫn còn điều kiện tham gia cuộc đua.
Bạn đúng! innodb_autoinc_lock_mode =0 hoạt động như một sự quyến rũ.
Trong trường hợp của bạn, tôi muốn biết tại sao rất nhiều lần chèn không thành công. Tôi nghi ngờ rằng giống như nhiều nhà phát triển SQL, bạn không kiểm tra trạng thái thành công sau khi bạn thực hiện các INSERT trong trình xử lý AJAX của mình, vì vậy bạn không bao giờ biết rằng rất nhiều người trong số họ đang thất bại.
Chúng có thể vẫn không thành công, bạn chỉ không mất id auto-inc như một tác dụng phụ. Bạn thực sự nên chẩn đoán tại sao rất nhiều lỗi xảy ra. Bạn có thể đang tạo dữ liệu không đầy đủ hoặc chạy nhiều giao dịch hơn mức cần thiết.