Ich würde einen anderen Ansatz wählen. Statt die Teilenummer beizubehalten, behalten Sie die Bestellung bei der Teile:
CREATE TABLE book_part (
book_id bigint NOT NULL,
part_order real NOT NULL,
name text NOT NULL,
PRIMARY KEY (book_id, part_order)
);
Der erste Teil, der eingegeben wird, erhält einen part_order
von 0,0. Wenn Sie am Anfang oder am Ende einen Teil hinzufügen, weisen Sie einfach part_order
zu 1,0 weniger oder mehr als das vorherige Minimum oder Maximum. Wenn Sie ein Teil zwischen zwei vorhandene Teile einfügen, weisen Sie eine part_order
zu das ist das arithmetische Mittel der angrenzenden Teile.
Ein Beispiel:
-- 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');
Die tatsächliche Teilenummer wird berechnet, wenn Sie die Tabelle abfragen:
SELECT book_id,
row_number() OVER (PARTITION BY book_id ORDER BY part_order) AS part,
name
FROM book_part;
Das Schöne daran ist, dass Sie nicht viele Zeilen aktualisieren müssen, wenn Sie einen Teil hinzufügen oder löschen.