Sceglierei un approccio diverso. Invece di mantenere il numero di parte, persistere l'ordine delle parti:
CREATE TABLE book_part (
book_id bigint NOT NULL,
part_order real NOT NULL,
name text NOT NULL,
PRIMARY KEY (book_id, part_order)
);
La prima parte che viene inserita riceve un part_order
di 0,0. Se aggiungi una parte all'inizio o alla fine, assegni semplicemente a part_order
1,0 in meno o in più rispetto al minimo o al massimo precedente. Se inserisci una parte tra due parti esistenti, assegni un part_order
questa è la media aritmetica delle parti adiacenti.
Un esempio:
-- 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');
Il numero di parte effettivo viene calcolato quando si interroga la tabella:
SELECT book_id,
row_number() OVER (PARTITION BY book_id ORDER BY part_order) AS part,
name
FROM book_part;
Il bello è che non è necessario aggiornare molte righe quando si aggiunge o si elimina una parte.