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

Как да създадете PostgreSQL разделена последователност?

Не вярвам, че има прост начин, който е толкова лесен, колкото обикновените поредици, защото:

  1. Последователността съхранява само един поток от числа (следваща стойност и т.н.). Искате по един за всеки дял.
  2. Последователностите имат специална обработка, която заобикаля текущата транзакция (за да се избегне условието за състезание). Трудно е да се повтори това на ниво SQL или PL/pgSQL, без да се използват трикове като dblink.
  3. Свойството на колоната DEFAULT може да използва прост израз или извикване на функция като nextval('myseq'); но не може да се отнася до други колони, за да информира функцията от кой поток трябва да идва стойността.

Можете да направите нещо, което работи, но вероятно няма да го мислите просто. Решаване на горните проблеми на свой ред:

  1. Използвайте таблица за съхраняване на следващата стойност за всички дялове със схема като multiseq (partition_id, next_val) .
  2. Напишете multinextval(seq_table, partition_id) функция, която прави нещо като следното:

    1. Създайте нова транзакция, независима от текущата транзакция (един от начините да направите това е чрез dblink; вярвам, че някои други сървърни езици могат да го направят по-лесно).
    2. Заключете таблицата, посочена в seq_table .
    3. Актуализирайте реда, където идентификаторът на дяла е partition_id , с увеличена стойност. (Или вмъкнете нов ред със стойност 2, ако няма съществуващ.)
    4. Отвържете тази транзакция и върнете предишния съхранен идентификатор (или 1).
  3. Създайте тригер за вмъкване в таблицата на вашите проекти, който използва извикване на multinextval('projects_table', NEW.Project_ID) за вмъквания.

Самият аз не съм използвал целия този план, но съм пробвал нещо подобно за всяка стъпка поотделно. Примери за multinextval функция и тригерът може да бъде предоставен, ако искате да опитате това...




  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 Изберете редове, където колона =масив

  2. Как да ПРОМЕНЯ PostgreSQL таблица и да направя колона уникална?

  3. Защо не мога да използвам псевдоними на колони в следващия израз SELECT?

  4. Първи стъпки с PostgreSQL 11 на Ubuntu 18.04

  5. PostgreSQL заявка за връщане на резултати като списък, разделен със запетая