Tôi không tin rằng có một cách đơn giản dễ dàng như các chuỗi thông thường, bởi vì:
- Một chuỗi chỉ lưu trữ một dòng số (giá trị tiếp theo, v.v.). Bạn muốn một cái cho mỗi phân vùng.
- Các chuỗi có cách xử lý đặc biệt bỏ qua giao dịch hiện tại (để tránh điều kiện đua). Thật khó để tái tạo điều này ở cấp SQL hoặc PL / pgSQL mà không sử dụng các thủ thuật như dblink.
- Thuộc tính cột DEFAULT có thể sử dụng một biểu thức đơn giản hoặc một lệnh gọi hàm như
nextval('myseq')
; nhưng nó không thể tham chiếu đến các cột khác để thông báo cho hàm xem dòng giá trị sẽ đến từ đâu.
Bạn có thể tạo ra một cái gì đó hiệu quả, nhưng có thể bạn sẽ không nghĩ nó đơn giản. Lần lượt giải quyết các vấn đề trên:
- Sử dụng bảng để lưu trữ giá trị tiếp theo cho tất cả các phân vùng, với một lược đồ như
multiseq (partition_id, next_val)
. -
Viết
multinextval(seq_table, partition_id)
hàm thực hiện một số chức năng như sau:- Tạo một giao dịch mới độc lập với giao dịch hiện tại (một cách để thực hiện việc này là thông qua dblink; tôi tin rằng một số ngôn ngữ máy chủ khác có thể thực hiện dễ dàng hơn).
- Khóa bảng được đề cập trong
seq_table
. - Cập nhật hàng có id phân vùng là
partition_id
, với một giá trị tăng dần. (Hoặc chèn một hàng mới với giá trị 2 nếu không có hàng nào hiện có.) - Cam kết giao dịch đó và trả lại id đã lưu trữ trước đó (hoặc 1).
-
Tạo một trình kích hoạt chèn trên bảng dự án của bạn sử dụng lệnh gọi đến
multinextval('projects_table', NEW.Project_ID)
để chèn.
Bản thân tôi chưa sử dụng toàn bộ kế hoạch này, nhưng tôi đã thử một cái gì đó tương tự với từng bước riêng lẻ. Ví dụ về multinextval
chức năng và trình kích hoạt có thể được cung cấp nếu bạn muốn thử điều này ...