PostgreSQL elimina todo el contenido

Respuestas:

114

El contenido de la tabla / tablas en la base de datos PostgreSQL se puede eliminar de varias formas.

Eliminar el contenido de la tabla usando sql:

Eliminar contenido de una tabla:

TRUNCATE table_name;
DELETE FROM table_name;

Eliminar contenido de todas las tablas nombradas:

TRUNCATE table_a, table_b, …, table_z;

Eliminación de contenido de tablas con nombre y tablas que hacen referencia a ellas (lo explicaré con más detalles más adelante en esta respuesta):

TRUNCATE table_a, table_b CASCADE;

Eliminando el contenido de la tabla usando pgAdmin:

Eliminar contenido de una tabla:

Right click on the table -> Truncate

Eliminando el contenido de la tabla y las tablas que hacen referencia a ella:

Right click on the table -> Truncate Cascaded

Diferencia entre eliminar y truncar:

De la documentación:

DELETE elimina las filas que satisfacen la cláusula WHERE de la tabla especificada. Si la cláusula WHERE está ausente, el efecto es eliminar todas las filas de la tabla. http://www.postgresql.org/docs/9.3/static/sql-delete.html

TRUNCATE es una extensión de PostgreSQL que proporciona un mecanismo más rápido para eliminar todas las filas de una tabla. TRUNCATE elimina rápidamente todas las filas de un conjunto de tablas. Tiene el mismo efecto que un DELETE no calificado en cada tabla, pero como en realidad no escanea las tablas, es más rápido. Además, recupera espacio en disco inmediatamente, en lugar de requerir una operación de VACÍO posterior. Esto es más útil en tablas grandes. http://www.postgresql.org/docs/9.1/static/sql-truncate.html

Trabajar con una tabla a la que se hace referencia desde otra tabla:

Cuando tiene una base de datos que tiene más de una tabla, las tablas probablemente tengan relación. Como ejemplo, hay tres tablas:

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

Y algunos datos preparados para estas tablas:

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

Los pedidos de la tabla hacen referencia a los clientes de la tabla y la tabla loyalty_cards hace referencia a los clientes de la tabla. Cuando intenta TRUNCAR / ELIMINAR DE la tabla a la que hacen referencia otras tablas (las otras tablas tienen una restricción de clave externa a la tabla nombrada), obtiene un error. Para eliminar contenido de las tres tablas, debe nombrar todas estas tablas (el orden no es importante)

TRUNCATE customers, loyalty_cards, orders;

o simplemente la tabla a la que se hace referencia con la palabra clave CASCADA (puede nombrar más tablas que solo una)

TRUNCATE customers CASCADE;

Lo mismo se aplica a pgAdmin. Haga clic derecho en la tabla de clientes y seleccione Truncar en cascada.

vitfo
fuente
TRUNCATEes parte de ANSI SQL y es compatible con todos los DBMS. Seguí el enlace y el documento no menciona nada sobre extensiones. ¿Quizás el enlace es incorrecto o no está actualizado?
Manngo
Hm, interesante. El texto citado todavía se puede encontrar aquí: postgresql.org/docs/9.0/static/sql-delete.html pero tiene razón: no está en el documento para 9.1.
vitfo
34

Para tablas pequeñasDELETE suele ser más rápido y necesita un bloqueo menos agresivo (para cargas concurrentes pesadas):

DELETE FROM tbl;

Sin WHEREcondición.

Para tablas medianas o más grandes , vaya con TRUNCATE tbl, como @Greg publicado.

Erwin Brandstetter
fuente
5
¿Qué es "pequeño", "mediano" y "más grande" (según su estimación)?
Jackson
3
@Jackson: Eso es difícil de precisar exactamente porque depende de demasiadas variables. Puede ejecutar algunas pruebas para encontrar el punto óptimo en su sistema.
Erwin Brandstetter