Подтвердить что ты не робот

PostgreSQL удалить весь контент

Здравствуйте, я хочу удалить все данные в моих таблицах postgresql, но не сама таблица. Как я могу это сделать?

4b9b3361

Ответ 2

Содержимое таблицы/таблиц в базе данных 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 и truncate:

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

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/DELETE Из таблицы, на которую ссылаются другие таблицы /s (другая таблица /s имеет ограничение внешнего ключа для указанной таблицы), вы получаете сообщение об ошибке. Чтобы удалить контент из всех трех таблиц, вы должны назвать все эти таблицы (порядок не важен)

TRUNCATE customers, loyalty_cards, orders;

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

TRUNCATE customers CASCADE;

То же самое относится к pgAdmin. Щелкните правой кнопкой мыши по таблице клиентов и выберите "Обрезать каскадом".

Ответ 3

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

DELETE FROM tbl;

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

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