PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Aktualisieren Sie den Teil (Bestellnummer), der der Primärschlüssel in Postgres ist

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.