Bộ đếm tăng tự động chỉ được lưu trữ trong bộ nhớ chính, không phải trên đĩa.
http://dev.mysql.com/doc/refman/4.1/en/innodb-auto-increment-handling.html
Vì điều này khi dịch vụ (hoặc máy chủ) khởi động lại, những điều sau đây sẽ xảy ra:
Sau khi khởi động máy chủ, lần đầu tiên chèn vào bảng t, InnoDB thực thi tương đương với câu lệnh này: CHỌN MAX (ai_col) TỪ ĐỂ CẬP NHẬT;
InnoDB tăng thêm một giá trị được lấy bởi câu lệnh và gán nó cho cột và cho bộ đếm tăng tự động cho bảng. Nếu bảng trống, InnoDB sử dụng giá trị 1.
Vì vậy, trong tiếng Anh đơn giản, sau khi dịch vụ MySQL khởi động, nó không biết giá trị tăng tự động cho bảng của bạn là gì. Vì vậy, khi bạn lần đầu tiên chèn một hàng, nó sẽ tìm giá trị tối đa của trường sử dụng tự động tăng, thêm 1 vào giá trị này và sử dụng giá trị kết quả. Nếu không có hàng, nó sẽ bắt đầu từ 1.
Đây là một vấn đề đối với chúng tôi, vì chúng tôi đang sử dụng tính năng tăng tự động của bảng và mysql để quản lý gọn gàng ID trong môi trường đa luồng, nơi người dùng được chuyển hướng đến trang web thanh toán của bên thứ ba. Vì vậy, chúng tôi phải đảm bảo ID mà bên thứ ba nhận và gửi lại cho chúng tôi là duy nhất và sẽ giữ nguyên như vậy (và tất nhiên có khả năng người dùng sẽ hủy giao dịch sau khi họ được chuyển hướng).
Vì vậy, chúng tôi đã tạo một hàng, lấy giá trị tăng tự động được tạo, xóa hàng để giữ bảng sạch và chuyển tiếp giá trị đến trang thanh toán. Cuối cùng, chúng tôi đã làm gì để khắc phục vấn đề về cách InnoDB xử lý các giá trị AI là như sau:
$query = "INSERT INTO transactions_counter () VALUES ();";
mysql_query($query);
$transactionId = mysql_insert_id();
$previousId = $transactionId - 1;
$query = "DELETE FROM transactions_counter WHERE transactionId='$previousId';";
mysql_query($query);
Điều này luôn giữ giao dịch mới nhất được tạo dưới dạng một hàng trong bảng, mà không cần thiết làm nổ tung bảng.
Hy vọng rằng sẽ giúp bất cứ ai khác có thể gặp phải điều này.
Chỉnh sửa (2018-04-18) :
Như Finesse đã đề cập dưới đây, có vẻ như hành vi này đã được sửa đổi trong MySQL 8.0+.
https://dev.mysql.com/worklog/task/?id=6204
Từ ngữ trong worklog đó bị lỗi nhiều nhất, tuy nhiên nó xuất hiện InnoDB trong các phiên bản mới hơn hiện hỗ trợ các giá trị tự động liên tục trong các lần khởi động lại.
-Gremio