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

Jak utworzyć sekwencję partycjonowaną PostgreSQL?

Nie wierzę, że istnieje prosty sposób, który jest tak prosty jak zwykłe sekwencje, ponieważ:

  1. Sekwencja przechowuje tylko jeden strumień liczb (następna wartość itp.). Potrzebujesz jednego dla każdej partycji.
  2. Sekwencje mają specjalną obsługę, która pomija bieżącą transakcję (aby uniknąć sytuacji wyścigu). Trudno jest to powtórzyć na poziomie SQL lub PL/pgSQL bez użycia sztuczek takich jak dblink.
  3. Właściwość kolumny DEFAULT może używać prostego wyrażenia lub wywołania funkcji, takiego jak nextval('myseq'); ale nie może odnosić się do innych kolumn, aby poinformować funkcję, z którego strumienia powinna pochodzić wartość.

Możesz zrobić coś, co działa, ale prawdopodobnie nie będzie to proste. Rozwiązując kolejno powyższe problemy:

  1. Użyj tabeli do przechowywania następnej wartości dla wszystkich partycji, ze schematem takim jak multiseq (partition_id, next_val) .
  2. Napisz multinextval(seq_table, partition_id) funkcja wykonująca coś takiego:

    1. Utwórz nową transakcję niezależną od bieżącej transakcji (jednym ze sposobów na zrobienie tego jest dblink; wierzę, że inne języki serwerów mogą to zrobić łatwiej).
    2. Zablokuj tabelę wymienioną w seq_table .
    3. Zaktualizuj wiersz, w którym identyfikator partycji to partition_id , o zwiększonej wartości. (Lub wstaw nowy wiersz o wartości 2, jeśli nie istnieje.)
    4. Zatwierdź tę transakcję i zwróć poprzedni przechowywany identyfikator (lub 1).
  3. Utwórz wyzwalacz wstawiania w tabeli projektów, który używa wywołania multinextval('projects_table', NEW.Project_ID) do wstawiania.

Sam nie korzystałem z tego całego planu, ale próbowałem czegoś podobnego dla każdego kroku z osobna. Przykłady multinextval funkcja i wyzwalacz mogą być dostarczone, jeśli chcesz spróbować tego...




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Importuj zrzut SQL do bazy danych PostgreSQL

  2. Jaki jest MySQL odpowiednik funkcji EXPLAIN ANALYZE w PostgreSQL?

  3. Używanie puli połączeń PgBouncer dla PostgreSQL z ClusterControl 1.8.2

  4. Co oznacza błąd importu:nie znaleziono symbolu:_PQencryptPasswordConn i jak to naprawić?

  5. Dlaczego potrzebujemy brokerów komunikatów, takich jak RabbitMQ, nad bazą danych, taką jak PostgreSQL?