PostgreSQL löscht alle Inhalte

Antworten:

112

Der Inhalt der Tabelle / Tabellen in der PostgreSQL-Datenbank kann auf verschiedene Arten gelöscht werden.

Löschen von Tabelleninhalten mit SQL:

Inhalt einer Tabelle löschen:

TRUNCATE table_name;
DELETE FROM table_name;

Inhalt aller benannten Tabellen löschen:

TRUNCATE table_a, table_b, …, table_z;

Löschen von Inhalten benannter Tabellen und Tabellen, die darauf verweisen (ich werde es später in dieser Antwort näher erläutern):

TRUNCATE table_a, table_b CASCADE;

Löschen von Tabelleninhalten mit pgAdmin:

Inhalt einer Tabelle löschen:

Right click on the table -> Truncate

Löschen von Tabelleninhalten und darauf verweisenden Tabellen:

Right click on the table -> Truncate Cascaded

Unterschied zwischen Löschen und Abschneiden:

Aus der Dokumentation:

DELETE löscht Zeilen, die die WHERE-Klausel erfüllen, aus der angegebenen Tabelle. Wenn die WHERE-Klausel fehlt, werden alle Zeilen in der Tabelle gelöscht. http://www.postgresql.org/docs/9.3/static/sql-delete.html

TRUNCATE ist eine PostgreSQL-Erweiterung, die einen schnelleren Mechanismus zum Entfernen aller Zeilen aus einer Tabelle bietet. TRUNCATE entfernt schnell alle Zeilen aus einer Reihe von Tabellen. Es hat den gleichen Effekt wie ein nicht qualifiziertes LÖSCHEN für jede Tabelle, aber da es die Tabellen nicht tatsächlich scannt, ist es schneller. Darüber hinaus wird sofort Speicherplatz zurückgewonnen, anstatt eine nachfolgende VACUUM-Operation zu erfordern. Dies ist am nützlichsten bei großen Tabellen. http://www.postgresql.org/docs/9.1/static/sql-truncate.html

Arbeiten mit Tabellen, auf die aus anderen Tabellen verwiesen wird:

Wenn Sie eine Datenbank mit mehr als einer Tabelle haben, haben die Tabellen wahrscheinlich eine Beziehung. Als Beispiel gibt es drei Tabellen:

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

Und einige vorbereitete Daten für diese Tabellen:

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

Tabellenbestellungen verweisen auf Tabellenkunden und Tabellenloyalitätskarten verweisen auf Tabellenkunden. Wenn Sie versuchen, TRUNCATE / DELETE FROM aus der Tabelle zu entfernen, auf die von anderen Tabellen verwiesen wird (die andere Tabelle hat eine Fremdschlüsseleinschränkung für die benannte Tabelle), wird eine Fehlermeldung angezeigt. Um Inhalte aus allen drei Tabellen zu löschen, müssen Sie alle diese Tabellen benennen (die Reihenfolge ist nicht wichtig).

TRUNCATE customers, loyalty_cards, orders;

oder nur die Tabelle, auf die mit dem Schlüsselwort CASCADE verwiesen wird (Sie können mehr Tabellen als nur eine benennen)

TRUNCATE customers CASCADE;

Gleiches gilt für pgAdmin. Klicken Sie mit der rechten Maustaste auf die Kundentabelle und wählen Sie Kaskadiert abschneiden.

vitfo
quelle
TRUNCATEist Teil von ANSI SQL und wird in allen DBMS unterstützt. Ich folgte dem Link und das Dokument erwähnt nichts über Erweiterungen. Vielleicht ist der Link falsch oder veraltet?
Manngo
Hm, interessant. Der zitierte Text ist immer noch hier zu finden: postgresql.org/docs/9.0/static/sql-delete.html, aber Sie haben Recht - er ist nicht in doc für 9.1 enthalten.
Vitfo
33

Bei kleinen Tischen DELETEist dies oft schneller und erfordert weniger aggressive Verriegelung (bei starker gleichzeitiger Belastung):

DELETE FROM tbl;

Ohne WHERE Bedingung.

Für mittlere oder größere Tabellen gehen Sie mit TRUNCATE tbl, wie @Greg gepostet.

Erwin Brandstetter
quelle
5
Was ist "klein", "mittel" und "größer" (nach Ihrer Einschätzung)?
Jackson
3
@Jackson: Das ist schwer genau zu bestimmen, weil es von zu vielen Variablen abhängt. Sie können einige Tests durchführen, um den Sweet Spot auf Ihrem System zu finden.
Erwin Brandstetter