Jeg ville vælge en anden tilgang. I stedet for at fastholde varenummeret, skal du fortsætte med ordren af delene:
CREATE TABLE book_part (
book_id bigint NOT NULL,
part_order real NOT NULL,
name text NOT NULL,
PRIMARY KEY (book_id, part_order)
);
Den første del, der bliver indtastet, får en part_order
på 0,0. Hvis du tilføjer en del i begyndelsen eller slutningen, tildeler du bare til part_order
1,0 mindre eller mere end det tidligere minimum eller maksimum. Hvis du indsætter en del mellem to eksisterende dele, tildeler du en part_order
det er det aritmetiske middelværdi af de tilstødende dele.
Et eksempel:
-- 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');
Det faktiske varenummer beregnes, når du forespørger i tabellen:
SELECT book_id,
row_number() OVER (PARTITION BY book_id ORDER BY part_order) AS part,
name
FROM book_part;
Det smukke ved det er, at du ikke behøver at opdatere mange rækker, når du tilføjer eller sletter en del.