PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Zaktualizuj część (numer zamówienia), która jest kluczem podstawowym w Postgresie

Wybrałbym inne podejście. Zamiast zachowywać numer części, zachowaj zamówienie części:

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

Pierwsza wprowadzona część otrzymuje part_order 0.0. Jeśli dodasz część na początku lub na końcu, po prostu przypisz do part_order 1,0 mniej lub więcej niż poprzednie minimum lub maksimum. Jeśli wstawisz część między dwie istniejące części, przypiszesz part_order to jest średnia arytmetyczna sąsiednich części.

Przykład:

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

Rzeczywisty numer części jest obliczany podczas zapytania do tabeli:

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

Piękno tego polega na tym, że nie trzeba aktualizować wielu wierszy podczas dodawania lub usuwania części.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL:Jak znaleźć brakujące liczby w kolumnie za pomocą generate_series()?

  2. Jak zaktualizować tabelę z tabeli łączącej?

  3. Utwórz bazę danych za pomocą zapisanej funkcji

  4. Skuteczna strategia pozostawiania śladu audytu/historii zmian dla aplikacji DB?

  5. PostgreSQL - utwórz kolumnę auto-inkrementacji dla klucza innego niż podstawowy