RETURNING
Itu bisa dilakukan dengan sekali jalan pulang pergi ke basis data:
INSERT INTO tbl(filename)
VALUES ('my_filename')
RETURNING tbl_id;
tbl_id
biasanya berupa serial
atau IDENTITY
(Postgres 10 atau lebih baru) kolom. Selengkapnya di manual.
Mengambil nilai secara eksplisit
Jika filename
perlu menyertakan tbl_id
(secara berlebihan), Anda masih dapat menggunakan satu kueri.
Gunakan lastval()
atau currval()
yang lebih spesifik :
INSERT INTO tbl (filename)
VALUES ('my_filename' || currval('tbl_tbl_id_seq') -- or lastval()
RETURNING tbl_id;
Lihat:
- Nilai referensi kolom serial di kolom lain selama INSERT yang sama
Jika beberapa urutan dapat dilanjutkan dalam proses (bahkan melalui pemicu atau efek samping lainnya) pasti caranya adalah dengan menggunakan currval('tbl_tbl_id_seq')
.
Nama urutan
literal string 'tbl_tbl_id_seq'
dalam contoh saya seharusnya aktual nama urutan dan dilemparkan ke regclass
, yang memunculkan pengecualian jika tidak ada urutan nama itu yang dapat ditemukan di search_path
saat ini .
tbl_tbl_id_seq
adalah default yang dibuat secara otomatis untuk tabel tbl
dengan kolom serial tbl_id
. Tapi tidak ada jaminan. Default kolom dapat mengambil nilai dari apa saja urutan jika ditentukan. Dan jika nama default diambil saat membuat tabel, Postgres memilih nama gratis berikutnya berdasarkan algoritma sederhana.
Jika Anda tidak tahu nama urutan untuk serial
kolom, gunakan fungsi khusus pg_get_serial_sequence()
. Dapat dilakukan dengan cepat:
INSERT INTO tbl (filename)
VALUES ('my_filename' || currval(pg_get_serial_sequence('tbl', 'tbl_id'))
RETURNING tbl_id;
db<>main biola di sini
sqlfiddle lama