← Назад к вопросам

Какой оператор удаляет данные из таблицы?

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;  # Удалит все строки

Лучшие практики

  1. Всегда используй WHERE — предотвращает случайное удаление всех данных
  2. Параметризованные запросы — защита от SQL injection
  3. Транзакции — откат при ошибках
  4. Резервные копии — перед удалением большого объема
  5. Логирование — отслеживай кто и что удалил
  6. Soft delete — рассмотри вариант с флагом deleted_at вместо полного удаления
Какой оператор удаляет данные из таблицы? | PrepBro