Bagaimana saya bisa menghapus semua tabel di PostgreSQL, bekerja dari baris perintah?
Saya tidak ingin menjatuhkan database itu sendiri, hanya semua tabel dan semua data di dalamnya.
postgresql
AP257
sumber
sumber
public
, Anda kehilangan ekstensi yang diinstal.Jawaban:
Jika semua tabel Anda dalam satu skema tunggal, pendekatan ini bisa berfungsi (kode di bawah ini mengasumsikan bahwa nama skema Anda adalah
public
)Jika Anda menggunakan PostgreSQL 9.3 atau lebih tinggi, Anda mungkin juga perlu mengembalikan hibah default.
sumber
pg_
) karena mereka berada dalam skema yang berbedapg_catalog
,.GRANT ALL ON SCHEMA public TO public;
setelah membuat.GRANT ALL
setelah membuat?Anda dapat menulis kueri untuk menghasilkan skrip SQL seperti ini:
Atau:
Dalam hal beberapa tabel secara otomatis dihapus karena opsi kaskade di kalimat sebelumnya.
Selain itu, sebagaimana dinyatakan dalam komentar, Anda mungkin ingin memfilter tabel yang ingin Anda singkirkan dengan nama skema:
Dan kemudian jalankan.
Glorious COPY + PASTE juga akan bekerja.
sumber
drop schema public cascade;
, tetapi Anda hampir selalu memiliki izin untuk menjatuhkan tabel.Jawaban yang paling diterima pada penulisan ini (Januari 2014) adalah:
Ini berhasil, namun jika niat Anda adalah mengembalikan skema publik ke kondisi semula, ini tidak sepenuhnya menyelesaikan tugas. Di bawah pgAdmin III untuk PostgreSQL 9.3.1, jika Anda mengklik skema "publik" yang dibuat dengan cara ini dan mencari di "SQL pane" Anda akan melihat yang berikut:
Namun, sebaliknya database baru akan memiliki yang berikut:
Bagi saya menggunakan kerangka web python yang membuat tabel database (web2py), menggunakan masalah yang disebabkan sebelumnya:
Jadi menurut saya jawaban yang sepenuhnya benar adalah:
Juga perhatikan untuk mengeluarkan perintah-perintah ini di pgAdmin III, saya menggunakan alat Query (ikon kaca pembesar "Jalankan query SQL yang sangat penting") atau Anda bisa menggunakan Plugins-> PSQL Console
Catatan
Jika Anda memiliki ekstensi apa pun yang terpasang, ekstensi itu akan dihapus ketika Anda membatalkan skema, jadi Anda harus mencatat apa yang perlu Anda instal dan kemudian jalankan pernyataan seperlunya. Misalnya
CREATE EXTENSION postgis;
sumber
drop
kemudiancreate
) digunakan untuk bekerja pada PostgreSQL 9.1. Setelah memutakhirkan ke 9.3, dua tambahangrant
diperlukan.Anda dapat menjatuhkan semua tabel dengan
IMO ini lebih baik daripada
drop schema public
, karena Anda tidak perlu membuat ulangschema
dan mengembalikan semua hibah.Bonus tambahan bahwa ini tidak memerlukan bahasa skrip eksternal, atau copy-paste SQL yang dihasilkan kembali ke penerjemah.
sumber
drop schema
trik karena pengguna bukan pemilik skema, hanya tabel. Yang ini berhasil :)EXECUTE 'DROP TABLE IF EXISTS ' || quote_ident(r.tablename) || ' CASCADE';
dengan ini:EXECUTE format('DROP TABLE IF EXISTS %I CASCADE', quote_ident(r.tablename));
Jika semua yang ingin Anda lepas dimiliki oleh pengguna yang sama, maka Anda dapat menggunakan:
Ini akan menghapus semua yang dimiliki pengguna.
Itu termasuk pandangan terwujud, pandangan, sekuens, pemicu, skema, fungsi, tipe, agregat, operator, domain, dan sebagainya (jadi, sungguh: semuanya ) yang
the_user
memiliki (= dibuat).Anda harus mengganti
the_user
dengan nama pengguna yang sebenarnya, saat ini tidak ada pilihan untuk meninggalkan semuanya untuk "pengguna saat ini". Versi 9.5 mendatang akan memiliki opsidrop owned by current_user
.Lebih detail dalam manual: http://www.postgresql.org/docs/current/static/sql-drop- owned.html
sumber
public
skema saya dimiliki olehpostgres
, tetapi semua yang lain dimiliki oleh pengguna tertentu, jadi menjatuhkan semua yang dimiliki oleh pengguna tersebut akan menghapus basis data kecuali untuk skema tersebut.Seperti Pablo di atas, untuk turun dari skema tertentu, sehubungan dengan kasus:
sumber
where schemaname='public'
bagian itu penting?harus melakukan trik.
sumber
CREATE SCHEMA public;
. Lihat juga stackoverflow.com/a/14286370 untuk informasi lebih lanjutMengikuti Pablo dan LenW, berikut adalah one-liner yang melakukan semuanya mempersiapkan dan kemudian mengeksekusi:
psql -U $PGUSER $PGDB -t -c "select 'drop table \"' || tablename || '\" cascade;' from pg_tables where schemaname = 'public'" | psql -U $PGUSER $PGDB
NB: atur atau ganti
$PGUSER
dan$PGDB
dengan nilai yang Anda inginkansumber
Jika Anda memiliki bahasa prosedural PL / PGSQL yang diinstal, Anda dapat menggunakan yang berikut ini untuk menghapus semuanya tanpa skrip eksternal shell / Perl.
Daripada mengetikkan ini di prompt "psql", saya sarankan Anda menyalinnya ke file dan kemudian meneruskan file tersebut sebagai input ke psql menggunakan opsi "--file" atau "-f":
Kredit di mana kredit jatuh tempo: Saya menulis fungsinya, tetapi berpikir pertanyaan (atau yang pertama setidaknya) berasal dari seseorang di salah satu milis pgsql tahun yang lalu. Tidak ingat persis kapan atau yang mana.
sumber
Jika Anda ingin menghapus semua tabel, Anda bisa membuang basa-basi seperti CASCADE dengan meletakkan semua tabel ke dalam satu pernyataan. Ini juga membuat eksekusi lebih cepat.
Menjalankannya secara langsung:
Ganti
TRUNCATE
dengan yangDROP
berlaku.sumber
public
skema, jangan lupa untuk memasukkan nama skema dalam ekspresi:string_agg(quote_ident(schemaname) || '.' || quote_ident(tablename), ', ')
alih-alih hanya meneruskan nama tabel.Saya memodifikasi jawaban Pablo sedikit demi kenyamanan agar perintah SQL yang dihasilkan dikembalikan sebagai satu string tunggal:
sumber
Gunakan skrip ini di pgAdmin:
sumber
Untuk jaga-jaga ... Skrip Python sederhana yang membersihkan database Postgresql
Pastikan bahwa setelah menyalin lekukan itu benar karena Python bergantung padanya.
sumber
Anda dapat menggunakan fungsi string_agg untuk membuat daftar yang dipisahkan koma, cocok untuk DROP TABLE. Dari skrip bash:
sumber
Jika Anda ingin menghapus data (bukan menghapus tabel):
Atau jika Anda ingin tabel drop Anda dapat menggunakan sql ini:
sumber
Catatan: jawaban saya adalah tentang menghapus tabel dan objek database lainnya; untuk menghapus semua data dalam tabel, yaitu memotong semua tabel , Endre Both telah memberikan pernyataan (eksekusi langsung) yang dijalankan dengan baik sebulan kemudian.
Untuk kasus-kasus di mana Anda tidak bisa hanya
DROP SCHEMA public CASCADE;
,DROP OWNED BY current_user;
atau sesuatu, di sini adalah skrip SQL yang berdiri sendiri yang saya tulis, yang aman untuk transaksi (yaitu Anda dapat meletakkannya di antaraBEGIN;
danROLLBACK;
untuk hanya mengujinya atauCOMMIT;
untuk benar-benar melakukan perbuatan) dan membersihkan "semua" objek basis data ... baik, semua yang digunakan dalam basis data yang digunakan aplikasi kita atau yang dapat saya tambahkan dengan bijaksana, yaitu:CHECK
,,UNIQUE
)VIEW
s (normal atau terwujud)public
atau DB-internal) “we” own: script berguna ketika dijalankan sebagai “bukan superuser basis data”; superuser dapat menghapus semua schemata (yang benar-benar penting masih secara eksplisit dikecualikan)Tidak jatuh adalah (beberapa disengaja; beberapa hanya karena saya tidak punya contoh dalam DB kami):
public
skema (misalnya untuk hal-hal ekstensi yang disediakan di dalamnya)Ini sangat berguna untuk kasus-kasus ketika dump yang ingin Anda pulihkan adalah versi skema database yang berbeda (misalnya dengan Debian
dbconfig-common
, Flyway atau Liquibase / DB-Manul) daripada database yang ingin Anda pulihkan.Saya juga punya versi yang menghapus "semuanya kecuali dua tabel dan apa yang menjadi milik mereka" (urutan, diuji secara manual, maaf, saya tahu, membosankan) jika ada yang tertarik; perbedaannya kecil. Hubungi saya atau periksa repo ini jika tertarik.
SQL
Diuji, kecuali penambahan selanjutnya (
extensions
disumbangkan oleh Clément Prévost ), di PostgreSQL 9.6 (jessie-backports
). Penghapusan agregat diuji pada 9.6 dan 12.2, penghapusan prosedur juga diuji pada 12.2. Selamat datang di perbaikan bug dan perbaikan lebih lanjut!sumber
DROP FUNCTION
gagal untuk suatu prosedur, dan sebaliknya. Saya memodifikasi bagian fungsi untuk ini:AND pp.prokind ='f' -- Function
atauAND pp.prokind ='p' -- Procedure
proisagg
) pada ≤ 10.x dan agregat dan prosedur (prokind
) pada ≥ 11 (diperiksa secara dinamis) dan menguji keduanya ☻ terima kasih atas petunjuknya.Ini adalah pertanyaan yang sangat menarik, dan Anda akan menyelesaikannya dengan berbagai cara. Semoga ini bermanfaat bagi Anda.
Di sini, Secara umum, kami memiliki
public
skema secara default. Jadi, saya menggunakannya sebagai contoh.Jika Anda menggunakan PostgreSQL 9.3 atau lebih tinggi, Anda mungkin juga perlu mengembalikan hibah default.
Ini akan membersihkan seluruh Skema dan membuatnya kembali sebagai yang baru.
Anda akan kehilangan entitas lain juga seperti
Functions
,Views
,Materialized views
, dllPostgreSQL menyimpan semua tabel pada tabel catatan bernama
pg_table
.Seperti yang Anda lihat, Dengan menggunakan subquery, Kami dapat menghapus seluruh tabel dari skema.
Ketika entitas data lainnya Penting dan Anda hanya ingin menghapus tabel saja dari skema, pendekatan ini akan sangat membantu Anda.
sumber
Anda perlu menjatuhkan tabel dan urutan, inilah yang bekerja untuk saya
sebelum Anda menjalankan perintah Anda mungkin perlu sudo / su ke
postgres
pengguna atau (koneksi ekspor detailPGHOST
,PGPORT
,PGUSER
danPGPASSWORD
) dan kemudianexport PGDATABASE=yourdatabase
sumber
Tugas Rake untuk Rails untuk menghancurkan semua tabel dalam database saat ini
sumber
rake db:create
, saya jalankan. Anda dapat melakukan Steve ujung dan menghapus kodetable_name =
dan perubahan", "
untuk","
dan#{ tables }
fo#{tables}
Langkah-langkah berikut mungkin bermanfaat (Untuk pengguna linux):
Pada awalnya, masukkan
postgres
prompt perintah dengan mengikuti perintah:Masukkan database dengan perintah ini (nama database saya adalah
maoss
:):Sekarang masukkan perintah untuk menjatuhkan semua tabel:
sumber
Saya meningkatkan metode bash dari jamie dengan menjaga pandangan karena dia hanya menghormati jenis tabel "tabel dasar" yang merupakan default.
mengikuti kode bash menghapus pandangan pertama dan kemudian semua sisanya
sumber
psql -d $PGDB -t --command "SELECT string_agg(sequence_name, ',') FROM information_schema.sequences WHERE sequence_schema='public' AND sequence_catalog='$PGDB'"
dalam file batch Windows:
sumber
baik, karena saya suka bekerja dari baris perintah ...
psql -U <user> -d <mydb> -c '\dt' | cut -d ' ' -f 4 | sed -e "s/^/drop table if exists /" | sed -e "s/$/;/"
-c '\dt'
akan memanggil perintah daftar tabel.List of relations Schema | Name | Type | Owner --------+-------------------+-------+---------- public | _d_psidxddlparm | table | djuser public | _d_psindexdefn | table | djuser
cut -d ' ' -f 4
sekarang, pipa outputnya untuk meraih bidang ke-4 (saat menggunakan ruang sebagai pemisah), yang merupakan tabel.sed
kemudian digunakan untuk awalan adrop table
dan suffix;
pemisah perintah.| egrep '_d_'
- Pipa menjadigrep
lebih banyak dan Anda bisa lebih selektif tentang tabel yang Anda jatuhkan.drop table if exists _d_psidxddlparm; drop table if exists _d_psindexdefn;
Catatan: seperti yang ditulis, ini akan menghasilkan baris palsu untuk
\dt
perintah output header kolom dan total baris di akhir. Saya menghindarinya dengan menangkap, tetapi Anda bisa menggunakanhead
dantail
.sumber
Cara termudah adalah dengan menjatuhkan skema publik seperti yang disarankan orang lain dalam jawaban sebelumnya. Namun, ini BUKAN cara yang baik. Anda tidak pernah tahu apa yang telah dilakukan pada skema publik yang sejak itu dilupakan dan tidak didokumentasikan. Anda juga tidak tahu apakah ini akan bekerja sama di masa depan. Di V9, itu akan baik-baik saja, tetapi di V10 semua pengguna Anda akan kehilangan akses ke skema, dan harus diberikan akses lagi jika aplikasi Anda akan rusak. Saya belum memeriksa V11, tetapi intinya adalah Anda tidak pernah tahu apa yang akan rusak ketika Anda berpindah dari satu mesin ke mesin, situs ke situs atau versi ke versi. Ini juga tidak dapat dilakukan jika Anda adalah pengguna yang memiliki akses ke database, tetapi tidak ke skema.
Jika Anda perlu melakukan ini secara terprogram maka jawaban lain di atas mencakup hal ini, tetapi satu hal yang tidak dipertimbangkan oleh jawaban di atas adalah membuat Postgres melakukan pekerjaan untuk Anda. Jika Anda menggunakan pg_dump dengan opsi -c seperti di bawah ini:
Itu akan membuat skrip pemulihan DB dengan pernyataan sql yang akan menghapus semua tabel.
Jika satu-satunya tujuan dalam mengajukan pertanyaan adalah untuk menghapus tabel sebelum mengembalikan, maka pengembalian Anda akan bekerja untuk Anda.
Namun, jika Anda membutuhkannya untuk hal lain, Anda cukup menyalin pernyataan drop dari skrip sql.
sumber