Tôi sẽ chọn một cách tiếp cận khác. Thay vì duy trì số bộ phận, hãy duy trì đơn đặt hàng của các bộ phận:
CREATE TABLE book_part (
book_id bigint NOT NULL,
part_order real NOT NULL,
name text NOT NULL,
PRIMARY KEY (book_id, part_order)
);
Phần đầu tiên được nhập sẽ nhận được một part_order
của 0,0. Nếu bạn thêm một phần vào đầu hoặc cuối, bạn chỉ cần gán cho part_order
Thấp hơn hoặc nhiều hơn 1,0 so với mức tối thiểu hoặc tối đa trước đó. Nếu bạn chèn một phần vào giữa hai phần hiện có, bạn chỉ định một part_order
đó là trung bình cộng của các phần liền kề.
Ví dụ:
-- insert the first part
INSERT INTO book_part VALUES (1, 0.0, 'Introduction');
-- insert a part at the end
INSERT INTO book_part VALUES (1, 1.0, 'Getting started with PostgreSQL');
-- insert a part between the two existing parts
INSERT INTO book_part VALUES (1, 0.5, 'The history of PostgreSQL');
-- adding yet another part between two existing parts
INSERT INTO book_part VALUES (1, 0.25, 'An introductory example');
Số phần thực tế được tính khi bạn truy vấn bảng:
SELECT book_id,
row_number() OVER (PARTITION BY book_id ORDER BY part_order) AS part,
name
FROM book_part;
Cái hay của điều đó là bạn không cần phải cập nhật nhiều hàng khi thêm hoặc xóa một phần.