RETURNING
Điều đó có thể thực hiện được với một chuyến khứ hồi vào cơ sở dữ liệu:
INSERT INTO tbl(filename)
VALUES ('my_filename')
RETURNING tbl_id;
tbl_id
thường sẽ là một serial
hoặc IDENTITY
(Postgres 10 trở lên). Xem thêm trong sách hướng dẫn.
Tìm nạp giá trị rõ ràng
Nếu filename
cần bao gồm tbl_id
(dư thừa), bạn vẫn có thể sử dụng một truy vấn.
Sử dụng lastval()
hoặc currval()
cụ thể hơn :
INSERT INTO tbl (filename)
VALUES ('my_filename' || currval('tbl_tbl_id_seq') -- or lastval()
RETURNING tbl_id;
Xem:
- Giá trị tham chiếu của cột nối tiếp trong một cột khác trong cùng một INSERT
Nếu nhiều trình tự có thể được nâng cao trong quá trình (thậm chí bằng cách kích hoạt hoặc các tác dụng phụ khác) thì chắc chắn cách là sử dụng currval('tbl_tbl_id_seq')
.
Tên của trình tự
Chuỗi ký tự 'tbl_tbl_id_seq'
trong ví dụ của tôi được cho là thực tế tên của trình tự và được chuyển thành regclass
, điều này dẫn đến một ngoại lệ nếu không tìm thấy chuỗi tên đó trong search_path
hiện tại .
tbl_tbl_id_seq
là mặc định được tạo tự động cho bảng tbl
với một cột nối tiếp tbl_id
. Nhưng không co sự bảo đảm nao. Mặc định cột có thể tìm nạp các giá trị từ bất kỳ trình tự nếu được xác định như vậy. Và nếu tên mặc định được sử dụng khi tạo bảng, Postgres sẽ chọn tên miễn phí tiếp theo theo một thuật toán đơn giản.
Nếu bạn không biết tên của chuỗi cho một serial
, sử dụng hàm chuyên dụng pg_get_serial_sequence()
. Có thể được thực hiện một cách nhanh chóng:
INSERT INTO tbl (filename)
VALUES ('my_filename' || currval(pg_get_serial_sequence('tbl', 'tbl_id'))
RETURNING tbl_id;
db <> fiddle here
Sqlfiddle cũ