Pertama, urutan yang dibuat secara otomatis untuk kolom serial dihapus secara otomatis , ketika kolom (atau tabel di dalamnya) dihapus. Masalah yang Anda gambarkan seharusnya tidak ada sejak awal. Hanya sangat versi lama PostgreSQL tidak melakukan itu. 7.4 atau lebih tua?
Solusi untuk masalah:
Kueri ini akan menghasilkan perintah DDL untuk menghapus semua urutan "tidak terikat" dalam database dieksekusi di:
SELECT string_agg('DROP SEQUENCE ' || c.oid::regclass, '; ') || ';' AS ddl
FROM pg_class c
LEFT JOIN pg_depend d ON d.refobjid = c.oid
AND d.deptype <> 'i'
WHERE c.relkind = 'S'
AND d.refobjid IS NULL;
Cast ke regclass
di c.oid::regclass
secara otomatis memenuhi syarat skema nama urutan jika diperlukan sesuai dengan search_path
saat ini . Lihat:
- Cara memeriksa apakah ada tabel dalam skema tertentu
- Bagaimana search_path mempengaruhi resolusi pengenal dan "skema saat ini"
Hasil:
DROP SEQUENCE foo_id_seq;
DROP SEQUENCE bar_id_seq;
...
Jalankan hasilnya untuk menjatuhkan semua urutan yang tidak terikat ke kolom serial (atau kolom lainnya). Pelajari arti kolom dan tabel di sini .
Hati-hati meskipun! Itu tidak berarti urutan tersebut tidak digunakan sebaliknya. Ada sejumlah kasus penggunaan di mana urutan dibuat sebagai objek yang berdiri sendiri. Misalnya jika Anda ingin beberapa kolom berbagi satu urutan. Anda harus tahu persis apa yang Anda lakukan.
Namun, Anda tidak bisa hapus urutan yang terikat ke serial
kolom dengan cara ini. Jadi operasinya aman di ini hormat.
DROP SEQUENCE test_id_seq
Hasil:
ERROR: cannot drop sequence test_id_seq because other objects depend on it
DETAIL: default for table test column id depends on sequence test_id_seq
HINT: Use DROP ... CASCADE to drop the dependent objects too.