0Pricing
SQL Academy · Урок

DELETE с USING и безопасные шаблоны

Удаляйте строки, соединённые с другими таблицами, с помощью DELETE ... USING, а перед опасными операциями используйте транзакции и сначала SELECT для проверки

«DELETE с USING и безопасные шаблоны» — бесплатный урок SQL Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Academy содержит 4 уроков всего.

Базовый DELETE

Удалить подходящие строки:

DELETE FROM users WHERE id = 1;

Всегда сначала проверяйте с помощью SELECT

Перед любым DELETE выполните тот же WHERE с SELECT, чтобы подтвердить количество строк:

SELECT COUNT(*) FROM orders
WHERE status = 'cancelled' AND created_at < NOW() - INTERVAL '1 year';

DELETE в транзакции

Заключайте разрушительные операции в транзакцию, чтобы можно было выполнить ROLLBACK:

BEGIN;
DELETE FROM orders WHERE status = 'cancelled' AND ...;
SELECT COUNT(*) FROM orders;       -- sanity check
-- COMMIT;  or ROLLBACK;

DELETE без WHERE — катастрофа

DELETE FROM users; очищает таблицу. Кнопки отмены нет. Будьте осторожны: ещё одна секунда на ввод WHERE — недорогая страховка.

DELETE … USING (удаление через JOIN в PostgreSQL)

Удалить строки в одной таблице на основании данных другой:

DELETE FROM orders o
USING users u
WHERE u.id = o.user_id
  AND u.is_banned = true;

DELETE с подзапросом

Стандартная альтернатива:

DELETE FROM orders
WHERE user_id IN (SELECT id FROM users WHERE is_banned);

Каскады FOREIGN KEY

Если у orders.user_id задано ON DELETE CASCADE, удаление пользователя автоматически удалит его заказы. Это удобно, но опасно — используйте такую возможность умеренно.

ALTER TABLE orders
  ADD CONSTRAINT orders_user_fk
  FOREIGN KEY (user_id) REFERENCES users(id)
  ON DELETE CASCADE;

Мягкое удаление

Многие приложения на самом деле не удаляют строки — они устанавливают временную отметку в deleted_at:

UPDATE users SET deleted_at = NOW() WHERE id = $1;

-- Every query then has:
WHERE deleted_at IS NULL

Удаление старых данных

Для периодической очистки больших таблиц удаляйте данные пакетами, чтобы избежать долгих транзакций:

DELETE FROM events
WHERE id IN (
  SELECT id FROM events
  WHERE created_at < NOW() - INTERVAL '90 days'
  LIMIT 10000
);
-- run this in a loop until it returns 0 rows

TRUNCATE: когда важна скорость

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

TRUNCATE TABLE staging_orders;
TRUNCATE TABLE staging_orders RESTART IDENTITY CASCADE;

RETURNING в DELETE

Получить удалённые строки — это полезно для архивирования:

WITH deleted AS (
  DELETE FROM orders WHERE status = 'archived' RETURNING *
)
INSERT INTO orders_archive SELECT * FROM deleted;

Итоги

DELETE — самый опасный оператор. Защитные приёмы:

  • Сначала выполняйте SELECT
  • Используйте BEGIN; ... ; ROLLBACK для пробного запуска
  • Удаляйте большие объёмы пакетами
  • Для данных, видимых пользователям, отдавайте предпочтение мягкому удалению
  • Используйте TRUNCATE только для промежуточных таблиц

Быстрая проверка

Вы выполнили DELETE FROM users; без WHERE. Что следует сделать?

Часто задаваемые вопросы

Урок «DELETE с USING и безопасные шаблоны» бесплатный?

Да — полный текст урока «DELETE с USING и безопасные шаблоны» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Academy, подпишись на CoddyKit PRO. Курс SQL Academy содержит 4 уроков всего.

Чему я научусь в уроке «DELETE с USING и безопасные шаблоны»?

Удаляйте строки, соединённые с другими таблицами, с помощью DELETE ... USING, а перед опасными операциями используйте транзакции и сначала SELECT для проверки Ты практикуешь SQL Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать SQL Academy?

Предыдущий опыт не требуется. SQL Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «DELETE с USING и безопасные шаблоны»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке SQL Academy?

Да. Каждый урок SQL Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. INSERT с несколькими строками
  2. UPSERT: ON CONFLICT DO UPDATE (PostgreSQL)
  3. UPDATE с FROM и обновления в стиле JOIN
  4. DELETE с USING и безопасные шаблоны
← Назад к SQL Academy