Saya mengubah db dari postgres ke mysql.
Karena saya tidak dapat menemukan alat yang melakukan triknya sendiri, saya akan mengonversi semua urutan postgres ke id peningkatan otomatis di mysql dengan nilai kenaikan otomatis.
Jadi, bagaimana saya bisa mendaftar semua urutan dalam Postgres DB ( versi 8.1 ) dengan informasi tentang tabel yang digunakannya, nilai selanjutnya dll dengan query SQL?
Ketahuilah bahwa saya tidak dapat menggunakan information_schema.sequences
tampilan dalam rilis 8.4.
Jawaban:
Kueri berikut memberikan nama semua urutan.
Biasanya urutan disebut sebagai
${table}_id_seq
. Pencocokan pola regex sederhana akan memberi Anda nama tabel.Untuk mendapatkan nilai terakhir dari suatu urutan gunakan permintaan berikut:
sumber
${table}_id_seq
petunjuk berguna${table}_${column}_seq
untuk urutan yang dibuat secara otomatisPerhatikan, bahwa mulai dari PostgreSQL 8.4 Anda bisa mendapatkan semua informasi tentang urutan yang digunakan dalam database melalui:
Karena saya menggunakan versi PostgreSQL (9.1) yang lebih tinggi, dan sedang mencari jawaban yang sama tinggi dan rendah, saya menambahkan jawaban ini demi anak cucu dan untuk pencari masa depan.
sumber
Jalankan:,
psql -E
lalu\ds
sumber
Setelah sedikit rasa sakit, saya mendapatkannya.
cara terbaik untuk mencapai ini adalah dengan mendaftar semua tabel
dan kemudian, untuk setiap tabel, daftar semua kolom dengan atribut
kemudian, untuk setiap kolom, uji apakah memiliki urutan
dan kemudian, dapatkan informasi tentang urutan ini
sumber
info urutan: nilai maks
SELECT * FROM information_schema.sequences;
info urutan: nilai terakhir
SELECT * FROM <sequence_name>
sumber
Hubungan antara urutan yang dibuat secara otomatis (seperti yang dibuat untuk kolom SERIAL) dan tabel induk dimodelkan oleh atribut pemilik urutan.
Anda dapat mengubah hubungan ini menggunakan klausa OWNED BY dari perintah ALTER SEQUENCE
misalnya ALTER SEQUENCE foo_id MILIK oleh foo_schema.foo_table
untuk mengaturnya agar ditautkan ke tabel foo_table
atau ALTER SEQUENCE foo_id MILIK NONE
untuk memutuskan koneksi antara urutan dan tabel apa saja
Informasi tentang hubungan ini disimpan dalam tabel katalog pg_depend .
hubungan bergabung adalah tautan antara pg_depend.objid -> pg_class.oid WHERE relkind = 'S' - yang menghubungkan urutan ke catatan bergabung dan kemudian pg_depend.refobjid -> pg_class.oid WHERE relkind = 'r', yang menghubungkan gabung record ke relasi yang memiliki (tabel)
Kueri ini mengembalikan semua urutan -> dependensi tabel dalam database. Klausa tempat memfilternya hanya menyertakan hubungan yang dibuat secara otomatis, yang membatasi hanya untuk menampilkan urutan yang dibuat oleh kolom yang diketik SERIAL.
sumber
Saya tahu posting ini cukup lama, tetapi saya menemukan solusi oleh CMS sangat berguna karena saya sedang mencari cara otomatis untuk menautkan urutan ke tabel DAN kolom, dan ingin berbagi. Penggunaan tabel katalog pg_depend adalah kuncinya. Saya memperluas apa yang dilakukan untuk:
Versi ini menambahkan kolom ke daftar bidang yang dikembalikan. Dengan kedua nama tabel dan nama kolom di tangan, panggilan ke pg_set_serial_afterence membuatnya mudah untuk memastikan bahwa semua urutan dalam database diatur dengan benar. Sebagai contoh:
Semoga ini bisa membantu seseorang dengan mengatur ulang urutan!
sumber
Pernyataan ini mencantumkan tabel dan kolom yang dikaitkan dengan setiap urutan:
Kode:
lebih banyak lihat di sini tautan untuk menjawab
sumber
Peningkatan jawaban sebelumnya:
sumber
Diuji sebagian tetapi sebagian besar terlihat lengkap.
Kredit di mana kredit jatuh tempo ... sebagian direkayasa balik dari SQL yang dicatat dari a pada tabel yang diketahui yang memiliki urutan. Saya yakin itu bisa lebih bersih juga, tapi hei, kinerja bukan masalah.
sumber
Jenis peretasan, tetapi coba ini:
Hapus UNION terakhir dan jalankan hasilnya
sumber
Dapatkan urutan dengan setiap kolom dari setiap tabel melalui penguraian klausa DEFAULT. Metode ini memberikan info tentang urutan kolom mana yang ditautkan dan tidak menggunakan dependensi yang mungkin tidak ada untuk beberapa urutan. Bahkan
pg_get_serial_sequence(sch.nspname||'.'||tbl.relname, col.attname)
fungsi menemukan tidak semua urutan untuk saya!Larutan:
Perhatikan bahwa 1 urutan dapat digunakan dalam beberapa tabel, sehingga dapat dicantumkan dalam beberapa baris di sini.
sumber
Terima kasih atas bantuan Anda.
Berikut adalah fungsi pl / pgsql yang memperbarui setiap urutan basis data.
sumber
Berikut ini adalah satu lagi yang memiliki nama skema di sebelah nama urutan
sumber
Fungsi ini menunjukkan nilai terakhir dari setiap urutan.
Ini menghasilkan tabel 2 kolom yang mengatakan nama urutan ditambah nilai yang terakhir dihasilkan.
sumber
Dengan asumsi
exec()
fungsi yang dideklarasikan dalam posting ini https://stackoverflow.com/a/46721603/653539 , urutan bersama dengan nilai terakhirnya dapat diambil menggunakan kueri tunggal:sumber
sumber
Berikut adalah contoh cara menggunakan
psql
untuk mendapatkan daftar semua urutan denganlast_value
:psql -U <username> -d <database> -t -c "SELECT 'SELECT ''' || c.relname || ''' as sequence_name, last_value FROM ' || c.relname || ';' FROM pg_class c WHERE (c.relkind = 'S')" | psql -U <username> -d <database> -t
sumber