PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Mettre à jour la partie (numéro de commande) qui est la clé primaire dans Postgres

Je choisirais une approche différente. Au lieu de conserver le numéro de pièce, conservez la commande des pièces :

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 première pièce saisie reçoit un part_order de 0,0. Si vous ajoutez une pièce au début ou à la fin, il vous suffit d'attribuer à part_order 1,0 de moins ou de plus que le minimum ou le maximum précédent. Si vous insérez une pièce entre deux pièces existantes, vous attribuez un part_order c'est la moyenne arithmétique des parties adjacentes.

Un exemple :

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

Le numéro de pièce réel est calculé lorsque vous interrogez le tableau :

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

La beauté de cela est que vous n'avez pas besoin de mettre à jour beaucoup de lignes lorsque vous ajoutez ou supprimez une partie.