PostgreSQL supprime tout le contenu

Réponses:

115

Le contenu de la table / des tables dans la base de données PostgreSQL peut être supprimé de plusieurs manières.

Suppression du contenu de la table à l'aide de SQL:

Suppression du contenu d'une table:

TRUNCATE table_name;
DELETE FROM table_name;

Suppression du contenu de toutes les tables nommées:

TRUNCATE table_a, table_b, …, table_z;

Suppression du contenu des tables nommées et des tables qui y font référence (je l'expliquerai plus en détail plus loin dans cette réponse):

TRUNCATE table_a, table_b CASCADE;

Suppression du contenu de la table à l'aide de pgAdmin:

Suppression du contenu d'une table:

Right click on the table -> Truncate

Suppression du contenu du tableau et des tableaux qui y font référence:

Right click on the table -> Truncate Cascaded

Différence entre supprimer et tronquer:

De la documentation:

DELETE supprime les lignes qui satisfont à la clause WHERE de la table spécifiée. Si la clause WHERE est absente, l'effet est de supprimer toutes les lignes de la table. http://www.postgresql.org/docs/9.3/static/sql-delete.html

TRUNCATE est une extension PostgreSQL qui fournit un mécanisme plus rapide pour supprimer toutes les lignes d'une table. TRUNCATE supprime rapidement toutes les lignes d'un ensemble de tables. Il a le même effet qu'un DELETE non qualifié sur chaque table, mais comme il ne scanne pas réellement les tables, il est plus rapide. En outre, il récupère immédiatement de l'espace disque, plutôt que d'exiger une opération VACUUM ultérieure. Ceci est très utile sur les grandes tables. http://www.postgresql.org/docs/9.1/static/sql-truncate.html

Travailler avec une table référencée à partir d'une autre table:

Lorsque vous avez une base de données qui a plus d'une table, les tables ont probablement une relation. A titre d'exemple, il y a trois tableaux:

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

Et quelques données préparées pour ces tableaux:

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

Les commandes de table font référence à la table clients et la table fidélité_cards fait référence à la table clients. Lorsque vous essayez de TRUNCATE / DELETE FROM la table qui est référencée par d'autres tables (les autres tables ont une contrainte de clé étrangère sur la table nommée), vous obtenez une erreur. Pour supprimer le contenu des trois tables, vous devez nommer toutes ces tables (l'ordre n'est pas important)

TRUNCATE customers, loyalty_cards, orders;

ou juste la table référencée avec le mot clé CASCADE (vous pouvez nommer plus de tables qu'une seule)

TRUNCATE customers CASCADE;

Il en va de même pour pgAdmin. Cliquez avec le bouton droit sur la table des clients et choisissez Tronquer en cascade.

vitfo
la source
TRUNCATEfait partie de ANSI SQL et est pris en charge dans tous les SGBD. J'ai suivi le lien et le document ne mentionne rien sur les extensions. Peut-être que le lien est incorrect ou obsolète?
Manngo
Hm, intéressant. Le texte cité peut toujours être trouvé ici: postgresql.org/docs/9.0/static/sql-delete.html mais vous avez raison - il n'est pas dans doc pour 9.1.
vitfo
34

Pour les petites tables, DELETEc'est souvent plus rapide et nécessite un verrouillage moins agressif (pour une charge simultanée élevée):

DELETE FROM tbl;

Sans WHEREcondition.

Pour les tables moyennes ou plus grandesTRUNCATE tbl , utilisez, comme @Greg publié.

Erwin Brandstetter
la source
5
Qu'est-ce que «petit», «moyen» et «plus grand» (selon votre estimation)?
Jackson
3
@Jackson: C'est difficile à cerner exactement parce que cela dépend de trop de variables. Vous pouvez exécuter des tests pour trouver le point idéal sur votre système.
Erwin Brandstetter