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 rowsTRUNCATE: когда важна скорость
Если действительно нужно полностью очистить таблицу, 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 — локальная установка не требуется.
Все уроки этого курса
- INSERT с несколькими строками
- UPSERT: ON CONFLICT DO UPDATE (PostgreSQL)
- UPDATE с FROM и обновления в стиле JOIN
- DELETE с USING и безопасные шаблоны