PostgreSQL có thể được thiết lập như thế này với số CREATE SEQUENCE seq_name
và sử dụng nextval(seq_name)
trên mỗi lần chèn.
MySQL không có hỗ trợ gốc cho điều này, bạn có thể mô phỏng hành vi của một SEQUENCE PostgreSQL bằng cách tạo một bảng chỉ với một cột và AUTO_INCREMENT
trên cột đó.
Bạn luôn chèn vào bảng đó trước tiên hãy đọc số LAST_INSERT_ID
của bảng đó để lấy id bạn cần để chèn vào bảng của mình. Nó sẽ là giao dịch an toàn để không trùng lặp sẽ được tạo ra.
Cách khác để đạt được điều này là tạo bảng có một cột không AUTO_INCREMENT
và chỉ một hàng giữ giá trị lớn nhất hiện tại. Mỗi lần bạn cần tăng thêm, bạn thực hiện UPDATE seq_table SET seq_column = seq_colum+1;
một bản cập nhật gia tăng là nguyên tử nhưng bạn cũng cần phải đọc giá trị sau đó tạo ra hai câu lệnh và chúng không phải nguyên tử với nhau trừ khi bạn đặt giao dịch xung quanh chúng và cách ly thích hợp cấp độ. Cách tiếp cận này tiết kiệm không gian nhưng cũng tạo ra các truy vấn khóa.
Nhiều chủ đề cố gắng để INSERT
sẽ phải đợi người khác cập nhật seq_table
trước khi có thể tự cập nhật và đọc giá trị mới.
Ngoài ra bạn phải quấn UPDATE
và SELECT
trên seq_table
trong một giao dịch với một thích hợp ISOLATION LEVEL
để tránh đọc giá trị mà một số chủ đề khác tăng lên sau khi bạn tăng lên nó.
Điều này có nghĩa là INSERTS
trở thành vấn đề giao dịch nhưng bình thường thì không, vì vậy tôi sẽ không đề xuất phương pháp thứ hai.
Nguồn
2012-07-04 10:35:12
Nếu bạn muốn đảm bảo tính duy nhất, bạn có thể sử dụng chức năng ['UUID_SHORT()'] của MySQL (http://dev.mysql.com/doc/en/miscellaneous-functions.html#function_uuid-short). – eggyal
MySQL không có trình tự (như hầu hết các DBMS khác làm). Bạn cần phải cuộn giải pháp của riêng bạn. –
Tôi không biết một cách tự nhiên. Nhưng có thể bạn có thể viết trình kích hoạt chèn để tìm kiếm tất cả các bảng cho chỉ mục cao nhất và trả về giá trị đó. Ít nhất trong lý thuyết, thành thật mà nói, tôi không chắc liệu điều đó có khả thi trong MySQL hay không. – acme