PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Актуализирайте част (номер на поръчка), която е първичен ключ в Postgre

Бих избрал различен подход. Вместо да запазвате номера на частта, запазвайте поръчката на частите:

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

Първата въведена част получава part_order от 0,0. Ако добавите част в началото или в края, вие просто присвоявате на part_order 1,0 по-малко или повече от предишния минимум или максимум. Ако вмъкнете част между две съществуващи части, присвоявате part_order това е средноаритметичното на съседните части.

Пример:

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

Действителният номер на частта се изчислява, когато правите заявка към таблицата:

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

Красотата на това е, че не е необходимо да актуализирате много редове, когато добавяте или изтривате част.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как date_trunc() работи в PostgreSQL

  2. Как да предефинирате глобално nextval в PostgreSQL?

  3. Postgres на високо ниво работи със скорост INSERT/UPDATE?

  4. Вземете второ съвпадение от резултатите от regexp_matches

  5. Docker-compose зависи от това да не се изчаква, докато зависимата от услугата не се стартира напълно