Với select max(id) + 1
cách tiếp cận, hai phiên chèn đồng thời sẽ thấy cùng một ID tối đa hiện tại từ bảng và cả hai đều chèn cùng một giá trị ID mới. Cách duy nhất để sử dụng điều này một cách an toàn là khóa bảng trước khi bắt đầu giao dịch, điều này gây khó khăn và tuần tự các giao dịch. (Và như Stijn đã chỉ ra, các giá trị có thể được sử dụng lại nếu bản ghi cao nhất bị xóa). Về cơ bản, không bao giờ sử dụng cách tiếp cận này. (Đôi khi có thể có lý do thuyết phục để làm như vậy, nhưng tôi không chắc mình đã từng thấy lý do nào).
Trình tự đảm bảo rằng hai phiên sẽ nhận được các giá trị khác nhau và không cần tuần tự hóa. Nó sẽ hoạt động tốt hơn và an toàn hơn, dễ viết mã hơn và dễ bảo trì hơn.
Cách duy nhất bạn có thể gặp lỗi trùng lặp khi sử dụng trình tự là nếu các bản ghi đã tồn tại trong bảng có ID cao hơn giá trị trình tự hoặc nếu có thứ gì đó vẫn đang chèn các bản ghi mà không sử dụng trình tự. Vì vậy, nếu bạn có một bảng hiện có với các ID được nhập theo cách thủ công, giả sử từ 1 đến 10 và bạn đã tạo một chuỗi với giá trị bắt đầu mặc định là 1, lần chèn đầu tiên bằng cách sử dụng chuỗi sẽ cố gắng chèn một ID là 1 - đã tồn tại . Sau khi thử 10 lần, trình tự sẽ cho bạn 11, sẽ hoạt động. Nếu sau đó bạn đã sử dụng phương pháp max-ID để thực hiện lần chèn tiếp theo sẽ sử dụng 12, nhưng trình tự vẫn ở trên 11 và cũng sẽ cung cấp cho bạn 12 vào lần tiếp theo bạn gọi nextval
.
Trình tự và bảng không liên quan. Trình tự không được cập nhật tự động nếu giá trị ID được tạo theo cách thủ công được chèn vào bảng, do đó, hai phương pháp không kết hợp với nhau. (Trong số những thứ khác, cùng một chuỗi có thể được sử dụng để tạo ID cho nhiều bảng, như đã đề cập trong tài liệu).
Nếu bạn đang thay đổi từ cách tiếp cận thủ công sang cách tiếp cận theo trình tự, bạn cần đảm bảo trình tự được tạo với giá trị bắt đầu bằng giá trị cao hơn tất cả các ID hiện có trong bảng và mọi thứ thực hiện chèn đều sử dụng trình tự chỉ trong tương lai.