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