Saya akan memilih pendekatan yang berbeda. Alih-alih mempertahankan nomor bagian, pertahankan pesanan bagian:
CREATE TABLE book_part (
book_id bigint NOT NULL,
part_order real NOT NULL,
name text NOT NULL,
PRIMARY KEY (book_id, part_order)
);
Bagian pertama yang dimasukkan mendapat part_order
dari 0,0. Jika Anda menambahkan bagian di awal atau akhir, Anda cukup menetapkan ke part_order
1,0 kurang atau lebih dari minimum atau maksimum sebelumnya. Jika Anda menyisipkan bagian di antara dua bagian yang ada, Anda menetapkan part_order
itu adalah rata-rata aritmatika dari bagian yang berdekatan.
Contoh:
-- 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');
Nomor bagian sebenarnya dihitung saat Anda menanyakan tabel:
SELECT book_id,
row_number() OVER (PARTITION BY book_id ORDER BY part_order) AS part,
name
FROM book_part;
Kelebihannya adalah Anda tidak perlu memperbarui banyak baris saat menambahkan atau menghapus bagian.