Witam Chcę usunąć wszystkie dane z moich tabel postgresql, ale nie samą tabelę. Jak mogłem to zrobić?
Odpowiedzi:
Użyj TRUNCATE TABLE
polecenia.
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.
TRUNCATE
jest 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?
W przypadku małych stołów DELETE
jest często szybszy i wymaga mniej agresywnego blokowania (przy dużym obciążeniu równoległym):
DELETE FROM tbl;
Bez WHERE
warunku.
W przypadku średnich lub większych stołów, użyj TRUNCATE tbl
, jak opublikowano @Greg.