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