Bagaimana saya bisa mentransfer ke database PostgreSQL lain
nilai ditugaskan terakhir dari bidang "auto-increment" dari jenis serial jika ada penghapusan dalam tabel, dan "hanya mengganti max (pk)" tidak lagi berfungsi?
Hanya sedikit orang yang tahu bahwa meskipun PG tidak menyediakan hingga versi 10
fungsi untuk mengetahui nilai terakhir dari urutan untuk bidang seperti itu
dari sesi lain , ini masih bisa dilakukan.

PostgreSQL mendukung bidang "kenaikan otomatis" yang ditentukan oleh
pseudotipe serial :
Tipe data smallserial, serial, dan bigserial bukan tipe nyata, tetapi hanya alat yang nyaman untuk membuat kolom dengan pengidentifikasi unik (mirip dengan properti AUTO_INCREMENT di beberapa DBMS).
Secara teknis, ini hanya tautan otomatis definisi DEFAULT untuk bidang dan nilai-nilai yang dihasilkan oleh objek
SEQUENCE . Dan kadang-kadang saya ingin melihat nilai-nilai ini - misalnya,
untuk mentransfernya ke database dalam struktur yang sama .
Tapi ini tidak mudah dilakukan:
saat ini
Mengembalikan nilai yang dikembalikan dari panggilan nextval terakhir untuk urutan ini di sesi saat ini. (Jika nextval tidak pernah dipanggil untuk urutan tertentu dalam sesi yang diberikan, kesalahan dikembalikan.) Karena nilai ini dibatasi oleh cakupan sesi, fungsi ini menghasilkan hasil yang dapat diprediksi, terlepas dari apakah nextval selanjutnya dipanggil dalam sesi lain atau tidak.
Pg_afterences tampilan sistemDimulai dengan PostgreSQL 10,
tampilan sistem
pg_afterences muncul , di mana informasi ini sudah terlihat tanpa banyak usaha.
Namun, mari kita coba mengeluarkan informasi ini:
CREATE TABLE tst( id serial
TABLE tst;
id | val -------- 1 | 1 2 | 2 3 | 4 4 | 8
Ini adalah nilai
id = 4
yang ingin kita dapatkan. Tetapi seseorang menghapus sebagian dari catatan, dan dalam tabel itu tidak ada lagi:
DELETE FROM tst WHERE id > 2;
id | val -------- 1 | 1 2 | 2
Pertama, kami akan menemukan nama urutan yang sesuai dengan bidang kami:
SELECT pg_get_serial_sequence('tst', 'id');
pg_get_serial_sequence ---------------------- public.tst_id_seq
Sekarang gunakan
nama urutan yang dihasilkan
sebagai tabel dalam kueri:
SELECT * FROM public.tst_id_seq;
last_value | log_cnt | is_called -------------------------------- 4 | 29 | t
Sebenarnya, bidang
last_value juga menyimpan nilai "terakhir" yang berhasil dihasilkan oleh urutan pada saat panggilan kami.
Sekarang mari kita membangun skrip sederhana untuk mentransfer nilai urutan dari satu database ke yang lain menggunakan
modul dblink :
Tetapi ingat bahwa jika ada aktivitas di pangkalan sumber, hasilnya akan tidak ditentukan!