sql >> Databasteknik >  >> RDS >> PostgreSQL

Uppdatera del (ordernummer) som är primärnyckel i Postgres

Jag skulle välja ett annat tillvägagångssätt. Istället för att bevara artikelnumret fortsätter du med beställningen av delarna:

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örsta delen som skrivs in får en part_order av 0,0. Om du lägger till en del i början eller slutet, tilldelar du bara till part_order 1,0 mindre eller mer än föregående minimum eller maximum. Om du infogar en del mellan två befintliga delar tilldelar du en part_order det är det aritmetiska medelvärdet av de intilliggande delarna.

Ett exempel:

-- 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 faktiska artikelnumret beräknas när du frågar i tabellen:

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

Det fina med det är att du inte behöver uppdatera många rader när du lägger till eller tar bort en del.



  1. SQL HAVING-klausul för nybörjare

  2. ALTER-tabell - lägger till AUTOINCREMENT i MySQL

  3. Hur infogar man FOR AUTO XML-resultat i tabellen?

  4. Mysql group_concat av upprepade nycklar och antal upprepningar av flera kolumner i en fråga (Frågeoptimering)