PostgreSQL удалить все содержимое

Ответы:

115

Содержимое таблицы / таблиц в базе данных PostgreSQL можно удалить несколькими способами.

Удаление содержимого таблицы с помощью sql:

Удаление содержимого одной таблицы:

TRUNCATE table_name;
DELETE FROM table_name;

Удаление содержимого всех названных таблиц:

TRUNCATE table_a, table_b, …, table_z;

Удаление содержимого именованных таблиц и таблиц, которые ссылаются на них (я объясню это более подробно позже в этом ответе):

TRUNCATE table_a, table_b CASCADE;

Удаление содержимого таблицы с помощью pgAdmin:

Удаление содержимого одной таблицы:

Right click on the table -> Truncate

Удаление содержимого таблицы и таблиц, которые на нее ссылаются:

Right click on the table -> Truncate Cascaded

Разница между удалением и усечением:

Из документации:

DELETE удаляет из указанной таблицы строки, удовлетворяющие условию WHERE. Если предложение WHERE отсутствует, результатом будет удаление всех строк в таблице. http://www.postgresql.org/docs/9.3/static/sql-delete.html

TRUNCATE - это расширение PostgreSQL, которое обеспечивает более быстрый механизм удаления всех строк из таблицы. TRUNCATE быстро удаляет все строки из набора таблиц. Он имеет тот же эффект, что и неквалифицированное удаление DELETE для каждой таблицы, но, поскольку он фактически не сканирует таблицы, он работает быстрее. Более того, он немедленно освобождает дисковое пространство, а не требует последующей операции VACUUM. Это наиболее полезно для больших столов. http://www.postgresql.org/docs/9.1/static/sql-truncate.html

Работа с таблицей, на которую ссылается другая таблица:

Если у вас есть база данных, в которой есть более одной таблицы, таблицы, вероятно, имеют взаимосвязь. В качестве примера можно привести три таблицы:

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

И некоторые подготовленные данные для этих таблиц:

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

Таблица заказов ссылается на таблицу клиентов, а таблица loyalty_cards ссылается на таблицу клиентов. Когда вы пытаетесь ОБРЕЗАТЬ / УДАЛИТЬ ИЗ таблицы, на которую ссылаются другие таблицы (другие таблицы имеют ограничение внешнего ключа для указанной таблицы), вы получаете сообщение об ошибке. Чтобы удалить контент из всех трех таблиц, вы должны назвать все эти таблицы (порядок не важен)

TRUNCATE customers, loyalty_cards, orders;

или просто таблица, на которую ссылается ключевое слово CASCADE (вы можете назвать больше таблиц, чем одну)

TRUNCATE customers CASCADE;

То же самое и с pgAdmin. Щелкните правой кнопкой мыши по таблице клиентов и выберите «Усечь каскадный».

Vitfo
источник
TRUNCATEявляется частью ANSI SQL и поддерживается всеми СУБД. Я перешел по ссылке, и в документе ничего не упоминается о расширениях. Возможно, ссылка неверная или устарела?
Manngo
Хм, интересно. Цитируемый текст все еще можно найти здесь: postgresql.org/docs/9.0/static/sql-delete.html, но вы правы - его нет в документации для 9.1.
vitfo
34

Для небольших таблиц DELETEчасто быстрее и требует менее агрессивной блокировки (для большой одновременной нагрузки):

DELETE FROM tbl;

Без WHEREусловий.

Для средних или больших столов используйте TRUNCATE tbl, например, @Greg posted.

Эрвин Брандштеттер
источник
5
Что такое «маленький», «средний» и «большой» (по вашей оценке)?
Джексон
3
@Jackson: Трудно точно определить, потому что это зависит от слишком большого количества переменных. Вы можете запустить несколько тестов, чтобы найти оптимальное место в вашей системе.
Эрвин Брандштеттер,