PostgreSQL menghapus semua konten

Jawaban:

115

Isi tabel / tabel dalam database PostgreSQL dapat dihapus dengan beberapa cara.

Menghapus isi tabel menggunakan sql:

Menghapus konten dari satu tabel:

TRUNCATE table_name;
DELETE FROM table_name;

Menghapus konten dari semua tabel bernama:

TRUNCATE table_a, table_b, …, table_z;

Menghapus konten dari tabel bernama dan tabel yang mereferensikannya (saya akan menjelaskannya secara lebih rinci nanti dalam jawaban ini):

TRUNCATE table_a, table_b CASCADE;

Menghapus konten tabel menggunakan pgAdmin:

Menghapus konten dari satu tabel:

Right click on the table -> Truncate

Menghapus konten tabel dan tabel yang mereferensikannya:

Right click on the table -> Truncate Cascaded

Perbedaan antara delete dan truncate:

Dari dokumentasi:

DELETE menghapus baris yang memenuhi klausa WHERE dari tabel yang ditentukan. Jika klausa WHERE tidak ada, efeknya adalah menghapus semua baris dalam tabel. http://www.postgresql.org/docs/9.3/static/sql-delete.html

TRUNCATE adalah ekstensi PostgreSQL yang menyediakan mekanisme lebih cepat untuk menghapus semua baris dari tabel. TRUNCATE dengan cepat menghapus semua baris dari satu set tabel. Ini memiliki efek yang sama seperti DELETE tanpa syarat pada setiap tabel, tetapi karena tidak benar-benar memindai tabel, ini lebih cepat. Selain itu, ia mengambil kembali ruang disk dengan segera, daripada memerlukan operasi VACUUM berikutnya. Ini paling berguna pada tabel besar. http://www.postgresql.org/docs/9.1/static/sql-truncate.html

Bekerja dengan tabel yang direferensikan dari tabel lain:

Saat Anda memiliki database yang memiliki lebih dari satu tabel, tabel tersebut mungkin memiliki hubungan. Sebagai contoh ada tiga tabel:

create table customers (
customer_id int not null,
name varchar(20),
surname varchar(30),
constraint pk_customer primary key (customer_id)
);

create table orders (
order_id int not null,
number int not null,
customer_id int not null,
constraint pk_order primary key (order_id),
constraint fk_customer foreign key (customer_id) references customers(customer_id)
);

create table loyalty_cards (
card_id int not null,
card_number varchar(10) not null,
customer_id int not null,
constraint pk_card primary key (card_id),
constraint fk_customer foreign key (customer_id) references customers(customer_id)
);

Dan beberapa data yang disiapkan untuk tabel ini:

insert into customers values (1, 'John', 'Smith');

insert into orders values 
(10, 1000, 1),
(11, 1009, 1),
(12, 1010, 1);        

insert into loyalty_cards values (100, 'A123456789', 1);

Tabel pesanan referensi tabel pelanggan dan tabel loyalty_cards tabel referensi pelanggan. Ketika Anda mencoba untuk TRUNCATE / DELETE DARI tabel yang direferensikan oleh tabel lain (tabel lain memiliki batasan kunci asing ke tabel bernama) Anda mendapatkan kesalahan. Untuk menghapus konten dari ketiga tabel Anda harus memberi nama semua tabel ini (urutannya tidak penting)

TRUNCATE customers, loyalty_cards, orders;

atau hanya tabel yang direferensikan dengan kata kunci CASCADE (Anda dapat memberi nama lebih dari satu tabel)

TRUNCATE customers CASCADE;

Hal yang sama berlaku untuk pgAdmin. Klik kanan pada tabel pelanggan dan pilih Truncate Cascaded.

vitfo
sumber
TRUNCATEadalah bagian dari ANSI SQL, dan didukung di semua DBMS. Saya mengikuti tautannya, dan dokumen tersebut tidak menyebutkan apa pun tentang ekstensi. Mungkin tautannya salah atau ketinggalan zaman?
Manngo
Hm, menarik. Teks yang dikutip masih dapat ditemukan di sini: postgresql.org/docs/9.0/static/sql-delete.html tetapi Anda benar - ini tidak ada dalam dokumen untuk 9.1.
vitfo
34

Untuk tabel kecilDELETE seringkali lebih cepat dan tidak membutuhkan penguncian yang agresif (untuk beban bersamaan yang berat):

DELETE FROM tbl;

Tanpa WHEREsyarat.

Untuk tabel sedang atau lebih besarTRUNCATE tbl , gunakan, seperti @Greg diposting.

Erwin Brandstetter
sumber
5
Apa yang dimaksud dengan "kecil", "sedang" dan "lebih besar" (menurut perkiraan Anda)?
Jackson
3
@ Jackson: Sulit untuk dijabarkan secara tepat karena itu bergantung pada terlalu banyak variabel. Anda dapat menjalankan beberapa tes untuk menemukan sweet spot di sistem Anda.
Erwin Brandstetter