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

PostgreSQL następna wartość sekwencji?

RETURNING

Jest to możliwe dzięki jednej podróży w obie strony do bazy danych:

INSERT INTO tbl(filename)
VALUES ('my_filename')
RETURNING tbl_id;

tbl_id zazwyczaj będzie to serial lub IDENTITY (Postgres 10 lub nowszy). Więcej w instrukcji.

Pobierz wartość jawnie

Jeśli filename musi zawierać tbl_id (nadmiarowo), nadal możesz użyć pojedynczego zapytania.

Użyj lastval() lub bardziej szczegółowy currval() :

INSERT INTO tbl (filename)
VALUES ('my_filename' || currval('tbl_tbl_id_seq')   -- or lastval()
RETURNING tbl_id;

Zobacz:

  • Wartość referencyjna kolumny szeregowej w innej kolumnie podczas tej samej INSERT

Jeśli w procesie można zaawansować wiele sekwencji (nawet poprzez wyzwalacze lub inne skutki uboczne), pewnie sposobem jest użycie currval('tbl_tbl_id_seq') .

Nazwa sekwencji

literał tekstowy 'tbl_tbl_id_seq' w moim przykładzie ma być rzeczywisty nazwa sekwencji i jest rzutowana na regclass , który zgłasza wyjątek, jeśli nie można znaleźć sekwencji tej nazwy w bieżącej search_path .

tbl_tbl_id_seq jest automatycznie generowaną wartością domyślną dla tabeli tbl z kolumną szeregową tbl_id . Ale nie ma gwarancji. Domyślna kolumna może pobierać wartości z dowolnego kolejność, jeśli tak zdefiniowano. A jeśli podczas tworzenia tabeli zostanie wybrana domyślna nazwa, Postgres wybierze następną wolną nazwę zgodnie z prostym algorytmem.

Jeśli nie wiesz nazwa sekwencji dla serial kolumna, użyj dedykowanej funkcji pg_get_serial_sequence() . Można to zrobić w locie:

INSERT INTO tbl (filename)
VALUES ('my_filename' || currval(pg_get_serial_sequence('tbl', 'tbl_id'))
RETURNING tbl_id;

db<>graj tutaj
Stary sqlfiddle



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ewolucja tolerancji błędów w PostgreSQL:faza replikacji

  2. Postgres UUID JDBC nie działa

  3. GeneratedValue w Postgres

  4. Kilka pomysłów na niskopoziomowe pulowanie zasobów w PostgreSQL

  5. PostgreSQL 'NIE W' ​​i podzapytanie