Ответ
DDL (Data Definition Language) — это подмножество SQL, предназначенное для определения и изменения структуры объектов базы данных (схемы).
Основные операции DDL:
-
CREATE — создание объектов (таблиц, индексов, представлений).
CREATE TABLE employees ( id INT PRIMARY KEY, name VARCHAR(100) NOT NULL, department_id INT REFERENCES departments(id) ); -
ALTER — изменение существующих объектов (добавление/удаление столбцов, изменение типов данных, добавление ограничений).
ALTER TABLE employees ADD COLUMN hire_date DATE; ALTER TABLE employees ALTER COLUMN name TYPE VARCHAR(200); -
DROP — полное удаление объектов из базы данных.
DROP TABLE employees; -
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, ёпта, классика! Это ж как скелет для всей твоей базы данных, её костяк, блядь. Без него — просто куча данных, как борщ без картошки, нихуя не то.
Короче, это такой набор команд, которым ты не данные трогаешь, а сам каркас, саму структуру лепишь. Таблицы, индексы — всё вот это вот архитектурное.
Чем этим богатыри обычно промышляют:
-
CREATE — это когда ты с нуля рожаешь какую-нибудь сущность. Вот прям из небытия, блядь.
CREATE TABLE employees ( id INT PRIMARY KEY, name VARCHAR(100) NOT NULL, department_id INT REFERENCES departments(id) );Смотри, родил табличку
employees. Сказал: «Будет у неёid— главный такой пацан,name— и чтоб не пустой, а то впадлу, иdepartment_id, который тыкает пальцем в другую таблицу». Всё, объект создан, теперь можно его запихивать. -
ALTER — а это когда твоё творение живёт уже, а тебе вдруг приспичило его переделать. То ли мозгов не хватило изначально, то ли требования поменялись. Типа «ой, забыл колонку
hire_dateдобавить, когда на работу взяли».ALTER TABLE employees ADD COLUMN hire_date DATE; ALTER TABLE employees ALTER COLUMN name TYPE VARCHAR(200);Первой командой ты прилепил новую колонку сбоку. Второй — расширил старую, потому что нашли какого-нибудь сотрудника с именем «Аристарх-Сигизмунд-Вальдемарович», и оно в сотню символов не влезло, пиздец.
-
DROP — самая простая и жёсткая команда. Никаких «может быть», «ой, я передумал». Просто взял и полностью выпилил объект с его данными в мусорное ведро истории.
DROP TABLE employees;Всё. Нет таблицы. Если бэкапа не было — сиди и плачь, мудак.
-
TRUNCATE — а это хитрая жопа. Она не удаляет таблицу, а выносит из неё всё содержимое подчистую, да так быстро, что мама не горюй.
TRUNCATE TABLE audit_log;Вот представь: у тебя лог-таблица на терабайт.
DELETE FROM audit_logбудет ебаться сто лет, всё логировать. АTRUNCATE— хрясь, и таблица пуста, структура на месте. Но и откатить это в рамках транзакции часто — хуй. Так что осторожно, ебать.
Из жизни, блядь:
- Весь этот DDL-цирк обычно живёт в миграциях (Liquibase, Flyway). Это чтобы твои «ой, забыл колонку» не вручную на прод-сервере делать, а чтоб скриптом, контролируемо, и чтобы каждый девелопер в команде мог схему повторить. Основа CI/CD, без этого — пизда порядку.
- Когда делаешь
ALTER TABLEна таблице в пару миллиардов строк, надо понимать, что она может на несколько минут всё заблокировать, и сайт ляжет. Стратегии есть, чтоб не так больно было — например, добавлять колонкуNULLбез дефолта, это обычно быстро. - Индексы (
CREATE INDEX,DROP INDEX) — это вообще отдельная песня, ебать мои старые костыли. Создал неправильный — запросы тормозят. Не создал нужный — всё тормозит. Удалил не тот — пиздец настал. Искусство, блядь, целое.