PostgreSQL elimina tutto il contenuto


Risposte:



114

Il contenuto della / delle tabelle nel database PostgreSQL può essere cancellato in diversi modi.

Eliminazione del contenuto della tabella utilizzando sql:

Eliminazione del contenuto di una tabella:

TRUNCATE table_name;
DELETE FROM table_name;

Eliminazione del contenuto di tutte le tabelle denominate:

TRUNCATE table_a, table_b, …, table_z;

Eliminazione del contenuto di tabelle denominate e tabelle che fanno riferimento a esse (lo spiegherò più in dettaglio più avanti in questa risposta):

TRUNCATE table_a, table_b CASCADE;

Eliminazione del contenuto della tabella utilizzando pgAdmin:

Eliminazione del contenuto di una tabella:

Right click on the table -> Truncate

Eliminazione del contenuto della tabella e delle tabelle che vi fanno riferimento:

Right click on the table -> Truncate Cascaded

Differenza tra eliminare e troncare:

Dalla documentazione:

DELETE elimina le righe che soddisfano la clausola WHERE dalla tabella specificata. Se la clausola WHERE è assente, l'effetto è di eliminare tutte le righe nella tabella. http://www.postgresql.org/docs/9.3/static/sql-delete.html

TRUNCATE è un'estensione PostgreSQL che fornisce un meccanismo più veloce per rimuovere tutte le righe da una tabella. TRUNCATE rimuove rapidamente tutte le righe da un insieme di tabelle. Ha lo stesso effetto di un DELETE non qualificato su ogni tabella, ma poiché non esegue effettivamente la scansione delle tabelle è più veloce. Inoltre, recupera immediatamente lo spazio su disco, invece di richiedere una successiva operazione di VACUUM. Ciò è particolarmente utile su tabelle di grandi dimensioni. http://www.postgresql.org/docs/9.1/static/sql-truncate.html

Lavorare con una tabella referenziata da un'altra tabella:

Quando hai un database che ha più di una tabella, le tabelle hanno probabilmente una relazione. A titolo di esempio ci sono tre tabelle:

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

E alcuni dati preparati per queste tabelle:

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

Tabella ordini riferimenti tabella clienti e tabella fedeltà_carte riferimenti tabella clienti. Quando si tenta di troncare / eliminare dalla tabella a cui fanno riferimento altre tabelle (l'altra tabella ha un vincolo di chiave esterna per la tabella denominata) si ottiene un errore. Per eliminare il contenuto da tutte e tre le tabelle devi nominare tutte queste tabelle (l'ordine non è importante)

TRUNCATE customers, loyalty_cards, orders;

o solo la tabella a cui si fa riferimento con la parola chiave CASCADE (è possibile nominare più tabelle di una sola)

TRUNCATE customers CASCADE;

Lo stesso vale per pgAdmin. Fai clic con il pulsante destro del mouse sulla tabella dei clienti e scegli Truncate Cascaded.


TRUNCATEfa parte di ANSI SQL ed è supportato in tutti i DBMS. Ho seguito il collegamento e il documento non menziona nulla sulle estensioni. Forse il collegamento non è corretto o non è aggiornato?
Manngo

Hm, interessante. Il testo citato può ancora essere trovato qui: postgresql.org/docs/9.0/static/sql-delete.html ma hai ragione - non è in doc per 9.1.
vitfo

34

Per i tavoli piccoliDELETE è spesso più veloce e richiede un blocco meno aggressivo (per carichi simultanei pesanti):

DELETE FROM tbl;

Senza WHEREcondizioni.

Per i tavoli medi o più grandi , vai con TRUNCATE tbl, come postato da @Greg.


5
Cosa significa "piccolo", "medio" e "grande" (secondo la tua stima)?
Jackson

3
@ Jackson: è difficile da definire esattamente perché dipende da troppe variabili. Puoi eseguire alcuni test per trovare il punto debole del tuo sistema.
Erwin Brandstetter
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.