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

Opdater del (ordrenummer), der er primær nøgle i Postgres

Jeg ville vælge en anden tilgang. I stedet for at fastholde varenummeret, skal du fortsætte med ordren af delene:

CREATE TABLE book_part (
   book_id bigint NOT NULL,
   part_order real NOT NULL,
   name text NOT NULL,
   PRIMARY KEY (book_id, part_order)
);
 

Den første del, der bliver indtastet, får en part_order på 0,0. Hvis du tilføjer en del i begyndelsen eller slutningen, tildeler du bare til part_order 1,0 mindre eller mere end det tidligere minimum eller maksimum. Hvis du indsætter en del mellem to eksisterende dele, tildeler du en part_order det er det aritmetiske middelværdi af de tilstødende dele.

Et eksempel:

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

Det faktiske varenummer beregnes, når du forespørger i tabellen:

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

Det smukke ved det er, at du ikke behøver at opdatere mange rækker, når du tilføjer eller sletter en del.



  1. MySQL-syntaksfejl:nær '1' på linje 1

  2. Hvad er forskellen mellem 'ÅÅÅÅ' og 'RRRR' i Oracle SQL

  3. Laravel Eloquent vælg alle rækker med max created_at

  4. Oprettelse af en rangliste, hvordan ville jeg gå frem for at vise rang/position?