Что такое DDL в SQL и какие основные операции он включает?

Ответ

DDL (Data Definition Language) — это подмножество SQL, предназначенное для определения и изменения структуры объектов базы данных (схемы).

Основные операции DDL:

  1. CREATE — создание объектов (таблиц, индексов, представлений).

    CREATE TABLE employees (
        id INT PRIMARY KEY,
        name VARCHAR(100) NOT NULL,
        department_id INT REFERENCES departments(id)
    );
  2. ALTER — изменение существующих объектов (добавление/удаление столбцов, изменение типов данных, добавление ограничений).

    ALTER TABLE employees ADD COLUMN hire_date DATE;
    ALTER TABLE employees ALTER COLUMN name TYPE VARCHAR(200);
  3. DROP — полное удаление объектов из базы данных.

    DROP TABLE employees;
  4. TRUNCATE — быстрая очистка всех данных из таблицы с сохранением её структуры. В отличие от DELETE, операция нелогируема (не пишет в WAL подробно) и не может быть откатана в рамках транзакции в некоторых СУБД.

    TRUNCATE TABLE audit_log;

Практический опыт:

  • Использование DDL в миграциях базы данных (Liquibase, Flyway) для контроля версий схемы в CI/CD.
  • Понимание блокировок, накладываемых операциями ALTER TABLE на больших таблицах, и стратегий для минимизации простоя (например, использование ALTER TABLE ... ADD COLUMN ... DEFAULT NULL).
  • Создание и управление индексами (CREATE INDEX, DROP INDEX) для оптимизации производительности запросов.

Ответ 18+ 🔞

А, DDL, ёпта, классика! Это ж как скелет для всей твоей базы данных, её костяк, блядь. Без него — просто куча данных, как борщ без картошки, нихуя не то.

Короче, это такой набор команд, которым ты не данные трогаешь, а сам каркас, саму структуру лепишь. Таблицы, индексы — всё вот это вот архитектурное.

Чем этим богатыри обычно промышляют:

  1. CREATE — это когда ты с нуля рожаешь какую-нибудь сущность. Вот прям из небытия, блядь.

    CREATE TABLE employees (
        id INT PRIMARY KEY,
        name VARCHAR(100) NOT NULL,
        department_id INT REFERENCES departments(id)
    );

    Смотри, родил табличку employees. Сказал: «Будет у неё id — главный такой пацан, name — и чтоб не пустой, а то впадлу, и department_id, который тыкает пальцем в другую таблицу». Всё, объект создан, теперь можно его запихивать.

  2. ALTER — а это когда твоё творение живёт уже, а тебе вдруг приспичило его переделать. То ли мозгов не хватило изначально, то ли требования поменялись. Типа «ой, забыл колонку hire_date добавить, когда на работу взяли».

    ALTER TABLE employees ADD COLUMN hire_date DATE;
    ALTER TABLE employees ALTER COLUMN name TYPE VARCHAR(200);

    Первой командой ты прилепил новую колонку сбоку. Второй — расширил старую, потому что нашли какого-нибудь сотрудника с именем «Аристарх-Сигизмунд-Вальдемарович», и оно в сотню символов не влезло, пиздец.

  3. DROP — самая простая и жёсткая команда. Никаких «может быть», «ой, я передумал». Просто взял и полностью выпилил объект с его данными в мусорное ведро истории.

    DROP TABLE employees;

    Всё. Нет таблицы. Если бэкапа не было — сиди и плачь, мудак.

  4. TRUNCATE — а это хитрая жопа. Она не удаляет таблицу, а выносит из неё всё содержимое подчистую, да так быстро, что мама не горюй.

    TRUNCATE TABLE audit_log;

    Вот представь: у тебя лог-таблица на терабайт. DELETE FROM audit_log будет ебаться сто лет, всё логировать. А TRUNCATE — хрясь, и таблица пуста, структура на месте. Но и откатить это в рамках транзакции часто — хуй. Так что осторожно, ебать.

Из жизни, блядь:

  • Весь этот DDL-цирк обычно живёт в миграциях (Liquibase, Flyway). Это чтобы твои «ой, забыл колонку» не вручную на прод-сервере делать, а чтоб скриптом, контролируемо, и чтобы каждый девелопер в команде мог схему повторить. Основа CI/CD, без этого — пизда порядку.
  • Когда делаешь ALTER TABLE на таблице в пару миллиардов строк, надо понимать, что она может на несколько минут всё заблокировать, и сайт ляжет. Стратегии есть, чтоб не так больно было — например, добавлять колонку NULL без дефолта, это обычно быстро.
  • Индексы (CREATE INDEX, DROP INDEX) — это вообще отдельная песня, ебать мои старые костыли. Создал неправильный — запросы тормозят. Не создал нужный — всё тормозит. Удалил не тот — пиздец настал. Искусство, блядь, целое.