2010-08-28 16 views
5

Có cách đơn giản (tức là không hacky) và điều kiện chủng tộc miễn phí để tạo một chuỗi được phân đoạn trong PostgreSQL hay không. Ví dụ:Làm thế nào để tạo một trình tự phân đoạn PostgreSQL?

Sử dụng một chuỗi bình thường trong Issue:

| Project_ID | Issue | 
| 1   | 1  | 
| 1   | 2  | 
| 2   | 3  | 
| 2   | 4  | 

Sử dụng một chuỗi phân vùng trong Issue:

| Project_ID | Issue | 
| 1   | 1  | 
| 1   | 2  | 
| 2   | 1  | 
| 2   | 2  | 
+0

Tôi rất vui khi biết có giải pháp thanh lịch cho vấn đề này hay không. Các giải pháp ở đây: http://stackoverflow.com/questions/4672629/postgresql-company-id-based-sequence không phải là xấu, nhưng nó sẽ được giao dịch an toàn? – Atorian

Trả lời

1

Tôi không tin rằng có một cách đơn giản đó là dễ dàng như trình tự thông thường , bởi vì:

  1. Một chuỗi chỉ lưu trữ một luồng số (giá trị tiếp theo, v.v.). Bạn muốn một cho mỗi phân vùng.
  2. Chuỗi có xử lý đặc biệt để bỏ qua giao dịch hiện tại (để tránh tình trạng cuộc đ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.
  3. Thuộc tính cột DEFAULT có thể sử dụng biểu thức đơn giản hoặc 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 các chức năng mà dòng giá trị nên đến từ.

Bạn có thể thực hiện điều gì đó hiệu quả, nhưng có thể bạn sẽ không nghĩ đơn giản. Giải quyết các vấn đề trên lần lượt:

  1. Sử dụng bảng để lưu trữ giá trị tiếp theo cho tất cả các phân đoạn, với lược đồ như multiseq (partition_id, next_val).
  2. Viết một hàm multinextval(seq_table, partition_id) mà không giống như sau:

    1. Tạo một giao dịch mới độc lập về giao dịch hiện tại (một chiều để làm điều 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ể làm điều đó hơn dễ dàng).
    2. Khóa bảng được đề cập trong seq_table.
    3. Cập nhật hàng có id phân vùng là partition_id, với giá trị gia tăng. (Hoặc chèn một hàng mới có giá trị 2 nếu không có hàng hiện có.)
    4. Cam kết giao dịch đó và trả lại id đã lưu trước đó (hoặc 1).
  3. Tạo trình kích hoạt chèn trên bảng dự án sử dụng lệnh gọi multinextval('projects_table', NEW.Project_ID) để chèn.

Tôi chưa tự mình sử dụng toàn bộ gói này, nhưng tôi đã thử một vài thứ tương tự với từng bước riêng lẻ. Ví dụ về chức năng multinextval và kích hoạt có thể được cung cấp nếu bạn muốn thử ...

Các vấn đề liên quan