PostgreSQL usuwa całą zawartość

Odpowiedzi:

115

Zawartość tabeli / tabel w bazie danych PostgreSQL można usunąć na kilka sposobów.

Usuwanie zawartości tabeli za pomocą sql:

Usuwanie zawartości jednej tabeli:

TRUNCATE table_name;
DELETE FROM table_name;

Usuwanie zawartości wszystkich nazwanych tabel:

TRUNCATE table_a, table_b, …, table_z;

Usuwanie zawartości nazwanych tabel i tabel, które się do nich odnoszą (wyjaśnię to bardziej szczegółowo w dalszej części odpowiedzi):

TRUNCATE table_a, table_b CASCADE;

Usuwanie zawartości tabeli za pomocą pgAdmin:

Usuwanie zawartości jednej tabeli:

Right click on the table -> Truncate

Usuwanie zawartości tabeli i tabel, które się do niej odwołują:

Right click on the table -> Truncate Cascaded

Różnica między usuwaniem a obcinaniem:

Z dokumentacji:

DELETE usuwa wiersze, które spełniają warunki klauzuli WHERE z określonej tabeli. Brak klauzuli WHERE skutkuje usunięciem wszystkich wierszy w tabeli. http://www.postgresql.org/docs/9.3/static/sql-delete.html

TRUNCATE to rozszerzenie PostgreSQL, które zapewnia szybszy mechanizm usuwania wszystkich wierszy z tabeli. TRUNCATE szybko usuwa wszystkie wiersze z zestawu tabel. Ma taki sam efekt jak niekwalifikowane DELETE na każdej tabeli, ale ponieważ w rzeczywistości nie skanuje tabel, jest szybsze. Ponadto natychmiast odzyskuje miejsce na dysku, zamiast wymagać kolejnej operacji VACUUM. Jest to najbardziej przydatne na dużych stołach. http://www.postgresql.org/docs/9.1/static/sql-truncate.html

Praca z tabelą, do której istnieją odniesienia z innej tabeli:

Jeśli masz bazę danych, która ma więcej niż jedną tabelę, prawdopodobnie istnieje związek między tabelami. Jako przykład są trzy tabele:

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)
);

I kilka przygotowanych danych do tych tabel:

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);

Zamówienia w tabeli odwołują się do klientów w tabeli, a karty lojalnościowe do tabeli odwołują się do klientów w tabeli. Podczas próby TRUNCATE / DELETE FROM tabeli, do której odwołują się inne tabele (inne tabele mają ograniczenie klucza obcego do wymienionej tabeli), pojawia się błąd. Aby usunąć zawartość ze wszystkich trzech tabel, musisz nazwać wszystkie te tabele (kolejność nie jest ważna)

TRUNCATE customers, loyalty_cards, orders;

lub po prostu tabela, do której odwołuje się słowo kluczowe CASCADE (możesz nazwać więcej tabel niż tylko jedna)

TRUNCATE customers CASCADE;

To samo dotyczy pgAdmin. Kliknij prawym przyciskiem myszy tabelę klientów i wybierz Obetnij kaskadowo.

vitfo
źródło
TRUNCATEjest częścią ANSI SQL i jest obsługiwany we wszystkich DBMS. Skorzystałem z linku i dokument nie wspomina o rozszerzeniach. Być może link jest nieprawidłowy lub nieaktualny?
Manngo
Hm, ciekawe. Cytowany tekst nadal można znaleźć tutaj: postgresql.org/docs/9.0/static/sql-delete.html, ale masz rację - nie ma go w dokumencie 9.1.
vitfo
34

W przypadku małych stołów DELETEjest często szybszy i wymaga mniej agresywnego blokowania (przy dużym obciążeniu równoległym):

DELETE FROM tbl;

Bez WHEREwarunku.

W przypadku średnich lub większych stołów, użyj TRUNCATE tbl, jak opublikowano @Greg.

Erwin Brandstetter
źródło
5
Co to jest „mały”, „średni” i „większy” (według Twojej oceny)?
Jackson
3
@Jackson: Trudno to dokładnie określić, ponieważ zależy to od zbyt wielu zmiennych. Możesz przeprowadzić kilka testów, aby znaleźć najlepsze miejsce w swoim systemie.
Erwin Brandstetter