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 используется для создания новых объектов базы данных. Основные виды объектов:
- Таблицы (
CREATE TABLE): определяет структуру таблицы, включая имена столбцов, их типы данных, ограничения (PRIMARY KEY, FOREIGN KEY, UNIQUE, NOT NULL, CHECK). Пример:
``sql CREATE TABLE users ( id INT PRIMARY KEY, name VARCHAR(100) NOT NULL, email VARCHAR(255) UNIQUE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); ``
- Индексы (
CREATE INDEX): ускоряет поиск и сортировку данных по определённым столбцам. Индексы могут быть уникальными (CREATE UNIQUE INDEX), составными (по нескольким столбцам) или функциональными (по выражению). - Представления (
CREATE VIEW): виртуальная таблица, основанная на результате SQL-запроса. Представления упрощают сложные запросы и могут обеспечивать дополнительный уровень безопасности, скрывая часть данных. - Схемы (
CREATE SCHEMA): логическая группировка объектов базы данных (таблиц, представлений, функций). Схемы позволяют организовать пространство имён и управлять правами доступа. - Последовательности (
CREATE SEQUENCE): генерирует уникальные числовые значения, часто используемые для автоматической генерации первичных ключей. - Триггеры (
CREATE TRIGGER): автоматически выполняет заданный код (обычно PL/SQL или T-SQL) при наступлении определённого события (INSERT, UPDATE, DELETE) на таблице. - Пользовательские типы данных (
CREATE TYPE): позволяет определить собственный структурированный тип данных, например, для хранения адреса или координат.
ALTER
Команда ALTER изменяет существующий объект базы данных. Наиболее часто используется для таблиц:
- Добавление столбца:
ALTER TABLE users ADD COLUMN phone VARCHAR(20); - Удаление столбца:
ALTER TABLE users DROP COLUMN phone; - Изменение типа данных столбца:
ALTER TABLE users ALTER COLUMN name TYPE TEXT; - Добавление или удаление ограничения:
ALTER TABLE users ADD CONSTRAINT unique_email UNIQUE (email); - Переименование столбца или таблицы:
ALTER TABLE users RENAME COLUMN email TO email_address;
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 определяет несколько основных категорий:
- Числовые:
INTEGER,SMALLINT,BIGINT,DECIMAL(p,s),NUMERIC(p,s),FLOAT,REAL. - Символьные строки:
CHAR(n)(фиксированная длина),VARCHAR(n)(переменная длина),TEXT(неограниченная длина, в некоторых СУБД). - Дата и время:
DATE,TIME,TIMESTAMP,INTERVAL. - Логические:
BOOLEAN(TRUE/FALSE/NULL). - Бинарные:
BLOB,BYTEA(в PostgreSQL) — для хранения изображений, файлов и других двоичных данных. - JSON/XML:
JSON,JSONB(PostgreSQL),XML— для хранения структурированных документов. - Пространственные:
GEOMETRY,GEOGRAPHY(PostGIS) — для географических данных.
Разные СУБД могут добавлять собственные типы (например, UUID в PostgreSQL, ENUM в MySQL, MONEY в SQL Server).
Ограничения (Constraints)
DDL позволяет задавать ограничения целостности данных на уровне таблицы или столбца. Основные виды:
- PRIMARY KEY: уникально идентифицирует каждую строку таблицы; не может содержать NULL.
- FOREIGN KEY: обеспечивает ссылочную целостность между таблицами; гарантирует, что значение в столбце дочерней таблицы существует в родительской.
- UNIQUE: гарантирует, что все значения в столбце (или группе столбцов) различны.
- NOT NULL: запрещает хранение NULL-значений в столбце.
- CHECK: задаёт пользовательское условие, которому должны удовлетворять значения (например,
CHECK (age >= 0 AND age <= 150)).
Ограничения могут быть именованными (для удобства управления) или безымянными (система генерирует имя автоматически).
Индексы
Индексы — это структуры данных, ускоряющие операции поиска и сортировки. DDL позволяет создавать различные типы индексов:
- B-tree (сбалансированное дерево): стандартный тип, поддерживающий все виды сравнений (=, >, <, BETWEEN, LIKE с префиксом).
- Hash: эффективен для точного поиска по равенству (=), но не поддерживает диапазонные запросы.
- GiST, GIN (PostgreSQL): для полнотекстового поиска, поиска по массивам, геоданным.
- Bitmap (Oracle): для столбцов с небольшим количеством различных значений (например, пол, статус).
- Clustered (SQL Server, MySQL InnoDB): определяет физический порядок строк на диске; таблица может иметь только один кластеризованный индекс.
Транзакционность 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; ``
Источники
- C. J. Date. «An Introduction to Database Systems» (8th edition).
- ISO/IEC 9075:2016 «Information technology — Database languages — SQL».
- Документация PostgreSQL 16: «Data Definition» (Chapter 5).
- Документация MySQL 8.0: «Data Definition Statements».
- Документация Microsoft SQL Server: «CREATE TABLE (Transact-SQL)».
- Документация Oracle Database: «SQL Language Reference».
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →