Je choisirais une approche différente. Au lieu de conserver le numéro de pièce, conservez la commande des pièces :
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 première pièce saisie reçoit un part_order
de 0,0. Si vous ajoutez une pièce au début ou à la fin, il vous suffit d'attribuer à part_order
1,0 de moins ou de plus que le minimum ou le maximum précédent. Si vous insérez une pièce entre deux pièces existantes, vous attribuez un part_order
c'est la moyenne arithmétique des parties adjacentes.
Un exemple :
-- 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');
Le numéro de pièce réel est calculé lorsque vous interrogez le tableau :
SELECT book_id,
row_number() OVER (PARTITION BY book_id ORDER BY part_order) AS part,
name
FROM book_part;
La beauté de cela est que vous n'avez pas besoin de mettre à jour beaucoup de lignes lorsque vous ajoutez ou supprimez une partie.