PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Aggiorna la parte (numero d'ordine) che è la chiave primaria in Postgres

Sceglierei un approccio diverso. Invece di mantenere il numero di parte, persistere l'ordine delle parti:

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 prima parte che viene inserita riceve un part_order di 0,0. Se aggiungi una parte all'inizio o alla fine, assegni semplicemente a part_order 1,0 in meno o in più rispetto al minimo o al massimo precedente. Se inserisci una parte tra due parti esistenti, assegni un part_order questa è la media aritmetica delle parti adiacenti.

Un esempio:

-- 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');

Il numero di parte effettivo viene calcolato quando si interroga la tabella:

SELECT book_id,
       row_number() OVER (PARTITION BY book_id ORDER BY part_order) AS part,
       name
FROM book_part;

Il bello è che non è necessario aggiornare molte righe quando si aggiunge o si elimina una parte.