Ik zou een andere aanpak kiezen. In plaats van het onderdeelnummer aan te houden, houd je de bestelling van de onderdelen:
CREATE TABLE book_part (
book_id bigint NOT NULL,
part_order real NOT NULL,
name text NOT NULL,
PRIMARY KEY (book_id, part_order)
);
Het eerste deel dat wordt ingevoerd krijgt een part_order
van 0,0. Als u een onderdeel aan het begin of het einde toevoegt, wijst u het gewoon toe aan part_order
1,0 minder of meer dan het vorige minimum of maximum. Als u een onderdeel tussen twee bestaande onderdelen invoegt, wijst u een part_order
. toe dat is het rekenkundig gemiddelde van de aangrenzende delen.
Een voorbeeld:
-- 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');
Het werkelijke onderdeelnummer wordt berekend wanneer u de tabel opvraagt:
SELECT book_id,
row_number() OVER (PARTITION BY book_id ORDER BY part_order) AS part,
name
FROM book_part;
Het mooie hiervan is dat je niet veel rijen hoeft bij te werken wanneer je een onderdeel toevoegt of verwijdert.