Открыть сервис

DDL

DDL (от англ. Data Definition Language — язык определения данных) — это подмножество языка SQL (Structured Query Language), предназначенное для создания, изменения и удаления объектов базы данных (таблиц, индексов, представлений, схем и других структур). DDL-команды управляют метаданными (данными о данных) и напрямую влияют на структуру базы данных, в отличие от DML (Data Manipulation Language), который управляет содержимым (записями) таблиц. DDL является фундаментальной частью реляционных систем управления базами данных (СУБД), таких как PostgreSQL, MySQL, Oracle Database, Microsoft SQL Server и других.

История и стандартизация

Концепция DDL возникла в рамках реляционной модели данных, предложенной Эдгаром Коддом в 1970 году. Первые реализации SQL, включая DDL, появились в коммерческих СУБД в конце 1970-х — начале 1980-х годов (например, Oracle, IBM DB2). Стандартизация SQL началась в 1980-х годах: первый международный стандарт SQL-86 (ANSI X3.135-1986) уже включал базовые DDL-команды. Последующие версии стандарта (SQL-89, SQL-92, SQL:1999, SQL:2003 и далее) расширяли возможности DDL, добавляя поддержку триггеров, хранимых процедур, пользовательских типов данных, секционирования таблиц и других объектов.

Стандарт SQL определяет синтаксис и семантику DDL, однако на практике каждая СУБД имеет собственные расширения и диалекты. Например, команда CREATE TABLE в PostgreSQL может включать специфические для этой СУБД параметры (например, наследование таблиц), отсутствующие в MySQL или Oracle.

Основные команды DDL

DDL состоит из трёх основных групп команд: CREATE (создание), ALTER (изменение) и DROP (удаление). Также к DDL часто относят команды TRUNCATE (очистка таблицы с удалением структуры) и RENAME (переименование объекта), хотя в некоторых классификациях их относят к DML или отдельным категориям.

CREATE

Команда CREATE используется для создания новых объектов базы данных. Основные виды объектов:

``sql CREATE TABLE users ( id INT PRIMARY KEY, name VARCHAR(100) NOT NULL, email VARCHAR(255) UNIQUE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); ``

ALTER

Команда ALTER изменяет существующий объект базы данных. Наиболее часто используется для таблиц:

ALTER также применяется к индексам (перестроение, переименование), представлениям (изменение определения), схемам (изменение владельца) и другим объектам.

DROP

Команда DROP полностью удаляет объект базы данных вместе со всеми его данными и метаданными. Например: ``sql DROP TABLE users; -- удаляет таблицу и все её строки DROP INDEX idx_users_email; -- удаляет индекс DROP VIEW active_users; -- удаляет представление ` Удаление объекта необратимо (если не используется механизм резервного копирования или транзакций). Некоторые СУБД поддерживают опцию IF EXISTS, которая предотвращает ошибку, если объект не существует: DROP TABLE IF EXISTS users;`.

TRUNCATE

Команда TRUNCATE удаляет все строки из таблицы, но сохраняет её структуру (столбцы, индексы, ограничения) для последующего использования. В отличие от DELETE (DML), TRUNCATE не генерирует пошаговые записи в журнале транзакций (в большинстве СУБД), что делает её значительно быстрее при очистке больших таблиц. Однако TRUNCATE не может быть выполнен, если таблица связана внешними ключами (без предварительного отключения ограничений).

RENAME

Команда RENAME переименовывает объект. В разных СУБД синтаксис может различаться: в PostgreSQL используется ALTER TABLE old_name RENAME TO new_name;, в MySQL — RENAME TABLE old_name TO new_name;. Переименование не затрагивает данные, но может нарушить работу приложений, использующих старое имя объекта.

Типы данных в DDL

При создании таблиц и других объектов DDL требует указания типов данных для каждого столбца. Стандарт SQL определяет несколько основных категорий:

Разные СУБД могут добавлять собственные типы (например, UUID в PostgreSQL, ENUM в MySQL, MONEY в SQL Server).

Ограничения (Constraints)

DDL позволяет задавать ограничения целостности данных на уровне таблицы или столбца. Основные виды:

Ограничения могут быть именованными (для удобства управления) или безымянными (система генерирует имя автоматически).

Индексы

Индексы — это структуры данных, ускоряющие операции поиска и сортировки. DDL позволяет создавать различные типы индексов:

Транзакционность DDL

В большинстве современных СУБД (PostgreSQL, Oracle, SQL Server, MySQL с InnoDB) DDL-команды являются транзакционными — они могут быть отменены с помощью ROLLBACK, если выполняются в рамках транзакции. Однако в некоторых СУБД (например, MySQL с MyISAM, старые версии SQLite) DDL-команды не поддерживают откат и выполняются немедленно. Транзакционность DDL позволяет безопасно вносить изменения в структуру базы данных, особенно в производственных средах.

DDL в контексте DevOps и миграций

DDL-скрипты широко используются в процессах управления изменениями базы данных (Database Migration). Инструменты вроде Flyway, Liquibase, Alembic (Python) позволяют версионировать DDL-изменения и автоматически применять их к базам данных при развёртывании приложений. Это обеспечивает согласованность структуры данных между средами разработки, тестирования и производства.

Примеры использования DDL

Создание базы данных и таблицы с внешним ключом

```sql CREATE DATABASE shop;

CREATE TABLE categories ( id INT PRIMARY KEY, name VARCHAR(100) NOT NULL );

CREATE TABLE products ( id INT PRIMARY KEY, name VARCHAR(200) NOT NULL, price DECIMAL(10,2) CHECK (price > 0), category_id INT, FOREIGN KEY (category_id) REFERENCES categories(id) ); ```

Добавление индекса и изменение таблицы

``sql CREATE INDEX idx_products_name ON products (name); ALTER TABLE products ADD COLUMN description TEXT; ALTER TABLE products ALTER COLUMN price SET DEFAULT 0.00; ``

Удаление объекта

``sql DROP TABLE IF EXISTS obsolete_products; DROP INDEX IF EXISTS idx_old_index; ``

Источники

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →