← Назад к вопросам
Какой оператор удаляет данные из таблицы?
2.0 Middle🔥 181 комментариев
#DevOps и инфраструктура
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
SQL оператор DELETE для удаления данных
Оператор DELETE — это основной SQL оператор для удаления строк из таблицы базы данных. Это один из четырех основных CRUD операторов (CREATE, READ, UPDATE, DELETE).
Базовый синтаксис
DELETE FROM таблица
WHERE условие;
Примеры использования
Удаление всех данных из таблицы
Внимание: эта операция удалит ВСЕ строки!
DELETE FROM users;
Удаление конкретных записей
-- Удалить пользователя с id = 5
DELETE FROM users
WHERE id = 5;
-- Удалить всех неактивных пользователей
DELETE FROM users
WHERE status = 'inactive';
-- Удалить записи старше года
DELETE FROM logs
WHERE created_at < NOW() - INTERVAL 1 YEAR;
Использование в Python приложениях
С использованием параметризованных запросов (защита от SQL injection)
import psycopg2
connection = psycopg2.connect("dbname=mydb user=postgres")
cursor = connection.cursor()
# Правильный способ — с параметрами
user_id = 5
cursor.execute("DELETE FROM users WHERE id = %s", (user_id,))
connection.commit()
cursor.close()
connection.close()
С использованием SQLAlchemy ORM
from sqlalchemy import delete, create_engine
from sqlalchemy.orm import Session
from models import User
engine = create_engine("postgresql://user:password@localhost/mydb")
with Session(engine) as session:
# Удалить конкретного пользователя
stmt = delete(User).where(User.id == 5)
session.execute(stmt)
session.commit()
# Удалить всех неактивных пользователей
session.execute(delete(User).where(User.status == 'inactive'))
session.commit()
С использованием SQLAlchemy Core
from sqlalchemy import delete, table, column, String, Integer
users_table = table('users',
column('id', Integer),
column('status', String)
)
stmt = delete(users_table).where(users_table.c.status == 'inactive')
# Выполнить
result = connection.execute(stmt)
print(f"Удалено строк: {result.rowcount}")
Важные моменты
1. WHERE условие обязательно!
# Опасно! Удалит всё
cursor.execute("DELETE FROM users")
# Правильно — указано условие
cursor.execute("DELETE FROM users WHERE is_active = false")
2. Транзакции
try:
cursor.execute("DELETE FROM users WHERE id = %s", (5,))
connection.commit() # Зафиксировать изменения
except Exception as e:
connection.rollback() # Откатить при ошибке
print(f"Ошибка: {e}")
3. CASCADE удаление
При наличии внешних ключей можно настроить каскадное удаление:
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
user_id INT REFERENCES users(id) ON DELETE CASCADE
);
-- При удалении пользователя автоматически удалятся его заказы
DELETE FROM users WHERE id = 5;
4. Проверка количества удаленных строк
cursor.execute("DELETE FROM users WHERE status = %s", ('inactive',))
deleted_count = cursor.rowcount
print(f"Удалено записей: {deleted_count}")
DELETE vs TRUNCATE
# DELETE — более безопасен, поддерживает WHERE
DELETE FROM users WHERE id > 100;
# TRUNCATE — быстрее, но удаляет ВСЁ и не поддерживает WHERE
TRUNCATE TABLE users; # Удалит все строки
Лучшие практики
- Всегда используй WHERE — предотвращает случайное удаление всех данных
- Параметризованные запросы — защита от SQL injection
- Транзакции — откат при ошибках
- Резервные копии — перед удалением большого объема
- Логирование — отслеживай кто и что удалил
- Soft delete — рассмотри вариант с флагом deleted_at вместо полного удаления