Saya secara teratur perlu menghapus semua data dari database PostgreSQL saya sebelum membangun kembali. Bagaimana saya melakukan ini secara langsung dalam SQL?
Saat ini saya sudah berhasil membuat pernyataan SQL yang mengembalikan semua perintah yang perlu saya jalankan:
SELECT 'TRUNCATE TABLE ' || tablename || ';' FROM pg_tables WHERE tableowner='MYUSER';
Tapi saya tidak bisa melihat cara untuk menjalankannya secara terprogram begitu saya memilikinya.
DECLARE r RECORD;
kemudian untuk loop:FOR r IN SELECT tablename FROM pg_tables LOOP
Kursor eksplisit jarang dibutuhkan dalam plpgsql. Gunakan kursor implisit yang lebih sederhana dan lebih cepat dari sebuah
FOR
loop:Catatan: Karena nama tabel tidak unik untuk setiap basis data, Anda harus memastikan skema-kualifikasi nama tabel untuk memastikan. Juga, saya membatasi fungsi ke skema 'publik' default. Sesuaikan dengan kebutuhan Anda, tetapi pastikan untuk mengecualikan skema sistem
pg_*
daninformation_schema
.Berhati -hatilah dengan fungsi-fungsi ini. Mereka mengabaikan database Anda. Saya menambahkan perangkat keamanan anak. Komentari
RAISE NOTICE
garis dan batalkan komentarEXECUTE
untuk meledakkan bom ...format()
membutuhkan Postgres 9.1 atau lebih baru. Di versi yang lebih lama, gabungkan string kueri seperti ini:Perintah tunggal, tanpa loop
Karena kita dapat
TRUNCATE
beberapa tabel sekaligus, kita tidak memerlukan kursor atau loop sama sekali:Gabungkan semua nama tabel dan jalankan satu pernyataan. Lebih sederhana, lebih cepat:
Panggilan:
Kueri yang disempurnakan
Anda bahkan tidak memerlukan fungsi. Di Postgres 9.0+ Anda dapat menjalankan perintah dinamis dalam sebuah
DO
pernyataan. Dan dalam Postgres 9.5+ sintaksanya bisa lebih sederhana:Tentang perbedaan antara
pg_class
,pg_tables
daninformation_schema.tables
:Tentang
regclass
dan mengutip nama tabel:Untuk penggunaan berulang
Buat database "templat" (sebut saja
my_template
) dengan struktur vanilla Anda dan semua tabel kosong. Kemudian, lewati aDROP
/CREATE DATABASE
cycle:Ini sangat cepat , karena Postgres menyalin seluruh struktur pada level file. Tidak ada masalah konkurensi atau overhead lainnya yang memperlambat Anda.
Jika koneksi bersamaan membuat Anda tidak menjatuhkan DB, pertimbangkan:
sumber
DROP DATABASE mydb
, jelas). Apakah Anda membingungkan skema dengan database, mungkin?DO
perintah (seperti pernyataan SQL lainnya) dijalankan dalam database saat ini secara eksklusif . Postgres tidak memiliki cara untuk mengakses database lain dalam transaksi yang sama. Anda harus menggunakan dblink atau FDW untuk melakukan itu. Tapi itu tidak mempengaruhi semua skema dalam database saat ini - kecuali jika Anda menambahkanWHERE t.schemaname = 'public'
untuk membatasi efek ke salah satu skema tertentu dalam kasus ini.Jika saya harus melakukan ini, saya hanya akan membuat skema sql dari db saat ini, kemudian drop & buat db, kemudian muat db dengan skema sql.
Berikut adalah langkah-langkahnya:
1) Buat skema dump database (
--schema-only
)pg_dump mydb -s > schema.sql
2) Jatuhkan basis data
drop database mydb;
3) Buat Basis Data
create database mydb;
4) Skema Impor
psql mydb < schema.sql
sumber
Dalam hal ini mungkin akan lebih baik untuk hanya memiliki database kosong yang Anda gunakan sebagai templat dan ketika Anda perlu menyegarkan, jatuhkan basis data yang ada dan buat yang baru dari templat.
sumber
Bisakah Anda menggunakan SQL dinamis untuk menjalankan setiap pernyataan secara bergantian? Anda mungkin harus menulis skrip PL / pgSQL untuk melakukan ini.
http://www.postgresql.org/docs/8.3/static/plpgsql-statements.html (bagian 38.5.4. Menjalankan Perintah Dinamis)
sumber
Anda dapat melakukannya dengan bash juga:
Anda perlu menyesuaikan nama skema, kata sandi, dan nama pengguna untuk mencocokkan skema Anda.
sumber
AUTO_INCREMENT
Versi pembersihan :sumber
Guys cara yang lebih baik dan bersih adalah dengan:
1) Membuat skema dump database (-schema-only) pg_dump mydb -s> schema.sql
2) Drop database drop database mydb;
3) Buat Database buat database mydb;
4) Impor Skema psql mydb <schema.sql
Ini bekerja untuk saya!
Semoga harimu menyenangkan. Hiram Walker
sumber
Jika Anda bisa menggunakan psql Anda bisa menggunakan
\gexec
perintah meta untuk mengeksekusi output query;Catatan yang
\gexec
diperkenalkan ke versi 9.6sumber
Untuk menghapus data dan mempertahankan struktur tabel di pgAdmin, Anda dapat melakukannya:
sumber