PostgreSQL видалити весь вміст


Відповіді:



114

Вміст таблиці / таблиць у базі даних 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);

Посилання на таблиці замовлень клієнтів та таблиці таблиць лояльності_картки. Якщо ви намагаєтесь ВІДКРИТИ / ВІДКЛЮЧИТИ З таблиці, на яку посилається інша таблиця / s (інша таблиця / s має обмеження зовнішнього ключа до названої таблиці), ви отримуєте помилку. Щоб видалити вміст з усіх трьох таблиць, ви повинні назвати всі ці таблиці (порядок не важливий)

TRUNCATE customers, loyalty_cards, orders;

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

TRUNCATE customers CASCADE;

Те саме стосується і pgAdmin. Клацніть правою кнопкою миші на таблиці клієнтів і оберіть «Скарочити каскад».


TRUNCATEє частиною ANSI SQL і підтримується у всіх СУБД. Я перейшов за посиланням, і в документі нічого не згадується про розширення. Можливо, посилання неправильне або застаріле?
Манго

Гм, цікаво. Цитований текст все-таки можна знайти тут: postgresql.org/docs/9.0/static/sql-delete.html, але ви маєте рацію - це не в документі 9.1.
vitfo

34

Для невеликих столів DELETEчасто швидше і потребує менш агресивного блокування (для великого одночасного навантаження):

DELETE FROM tbl;

Без WHEREумови.

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


5
Що таке "малий", "середній" та "більший" (за вашою оцінкою)?
Джексон

3
@Jackson: Це важко точно визначити, оскільки це залежить від занадто багато змінних. Ви можете запустити кілька тестів, щоб знайти солодке місце у вашій системі.
Ервін Брандстеттер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.