2012-07-04 7 views
5

Có khả năng tự động tăng không tương thích gốc tự do cho tất cả các bảng trong mySQL không? Tôi có nghĩa là, không chỉ tự động inc mỗi bảng, tôi có nghĩa là ONE số đếm lên cho MACHI hàng mới trong cơ sở dữ liệu?Có tự động tăng trên toàn bộ cơ sở dữ liệu (không phải mỗi bảng!) Trong mySQL?

Tôi đã thấy điều này trên một oracle chuyên nghiệp (?) Được thiết lập. Ưu điểm chính là bạn có id duy nhất cho TẤT CẢ hàng/yếu tố trong TẤT CẢ các bảng, không chỉ PER BẢNG.

+2

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

+0

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. –

+0

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

Trả lời

6

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 UPDATESELECT 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.

+0

Để loại bỏ nhiều hàng trong cách tiếp cận đầu tiên, trước tiên chúng ta có thể xóa tất cả các hàng và sau đó thực hiện chèn. – palindrom