Ограничения целостности в SQL
Первичный ключ (PRIMARY KEY)
Ограничение
первичный ключ (PRIMARY KEY) задаётся при создании таблицы. Пример:
sql
CREATE TABLE Students (
ID INTEGER NOT NULL PRIMARY KEY,
GroupID INTEGER,
FirstName VARCHAR(50),
LastName VARCHAR(50),
Age INTEGER
);
Поле ID объявлено как
NOT NULL PRIMARY KEY — это сочетание гарантирует уникальность и невозможность пустых значений.
Если таблица уже существует, первичный ключ можно добавить с помощью
ALTER TABLE:
sql
ALTER TABLE Students
ADD CONSTRAINT PK_1 PRIMARY KEY (ID);
Каждое ограничение должно иметь уникальное имя (например,
PK_1). Имя выбирается произвольно и служит для идентификации ограничения.
Уникальность (UNIQUE)
Ограничение
уникальность (UNIQUE) близко к первичному ключу, но допускает наличие
NULL (если не задано
NOT NULL). Добавляется аналогично:
sql
ALTER TABLE Students
ADD CONSTRAINT UNIQ_1 UNIQUE (ID);
Здесь ограничению присвоено имя
UNIQ_1, и оно гарантирует, что все значения в столбце
ID будут различаться.
Проверка (CHECK)
Ограничение
проверка (CHECK) задаёт условие для значений поля. Например, возраст должен быть больше 18:
sql
CREATE TABLE Students (
ID INTEGER NOT NULL,
Age INTEGER CHECK (Age > 18)
);
Условие внутри
CHECK не ограничивается простым сравнением — оно может содержать полноценный подзапрос. Скажем, значение
Age должно быть больше среднего возраста из другой таблицы:
sql
Age INTEGER CHECK (Age > (SELECT AVG(Age) FROM OtherTable))
Для добавления CHECK к существующей таблице:
sql
ALTER TABLE Students
ADD CONSTRAINT CHK_1 CHECK (Age > 18);
Внешний ключ (FOREIGN KEY)
Ограничение
внешний ключ (FOREIGN KEY) связывает две таблицы. Дочерняя таблица содержит столбец, ссылающийся на родительский ключ. Пример: в таблице
Students поле
GroupID ссылается на
ID таблицы
Groups:
sql
CREATE TABLE Students (
ID INTEGER NOT NULL PRIMARY KEY,
GroupID INTEGER,
...
CONSTRAINT FK_Group FOREIGN KEY (GroupID) REFERENCES Groups(ID)
);
Имя ограничения —
FK_Group. Если таблица уже создана, внешний ключ добавляется командой:
sql
ALTER TABLE Students
ADD CONSTRAINT FK_Group FOREIGN KEY (GroupID) REFERENCES Groups(ID);
DDL через графический интерфейс
Создание таблиц, баз данных и других объектов можно выполнять не только написанием кода, но и с помощью
графического интерфейса клиента, например Microsoft SQL Server Management Studio. Пользователь задаёт параметры щелчками мыши, а затем нажимает кнопку
Script. Клиент генерирует готовый SQL-код, полностью соответствующий выполненным в интерфейсе настройкам.
Пример сгенерированного скрипта для создания базы данных:
sql
CREATE DATABASE Test
ON PRIMARY
( NAME = N'Test', FILENAME = N'...\Test.mdf' , SIZE = 100MB , ... )
LOG ON
( NAME = N'Test_log', FILENAME = N'...\Test_log.ldf' , SIZE = 100MB , ... )
...
ALTER DATABASE Test SET COMPATIBILITY_LEVEL = 100;
ALTER DATABASE Test SET ANSI_PADDING OFF;
...
В коде видны специфические для
Transact-SQL (T-SQL) параметры:
COMPATIBILITY_LEVEL,
ANSI_PADDING и многие другие. Все они принадлежат конкретной СУБД — Microsoft SQL Server — и отсутствуют в стандарте SQL.
Диалекты SQL и практическое изучение
Современные СУБД обладают собственными диалектами:
PL/SQL (Oracle),
T-SQL (SQL Server),
MySQL,
PostgreSQL и др. Изучить все реализации досконально невозможно из-за огромного объёма функциональности и частых обновлений.
Продуктивный подход:
• освоить
общие концепции языка и стандарт;
• получить практический опыт в одном-двух диалектах;
• встречая незнакомый параметр (например,
ANSI_PADDING), обратиться к документации конкретной СУБД и понять его смысл. Так,
ANSI_PADDING ON определяет, будут ли значения типа
CHAR или
VARCHAR дополняться пробелами до указанной длины.
Уверенное владение общими принципами позволяет быстро адаптироваться к любому диалекту в условиях реального проекта.
Управление другими объектами
Те же операции
CREATE,
ALTER,
DROP применяются ко всем структурам базы данных:
доменам,
представлениям (VIEW),
хранимым процедурам,
триггерам,
генераторам,
индексам. Достаточно заменить в синтаксисе
TABLE на имя соответствующего типа объекта. DDL-компонента языка универсальна: выбор действия (создать, изменить, удалить) определяет ключевое слово, а дальнейший синтаксис зависит от типа объекта.
Переход к языку манипулирования данными (DML)
Всё рассмотренное выше относится к
языку определения данных (Data Definition Language, DDL). Центральную же роль в SQL играет
язык манипулирования данными (Data Manipulation Language, DML). Именно с его помощью выполняются основные действия над содержимым таблиц: извлечение данных (
SELECT), вставка (
INSERT), удаление (
DELETE) и обновление (
UPDATE). Именно DML решает главную задачу любой базы данных — работу с данными.
Краткие итоги
Освоение синтаксиса ограничений даёт фундамент для проектирования надёжных схем данных. Логика изложения построена от простого к сложному: сначала вводятся четыре базовых типа ограничений, объясняется их роль, затем демонстрируются два способа внедрения – декларативно при создании таблицы и императивно через изменение существующей структуры. Попутно подчёркивается важность именования ограничений, позволяющего в дальнейшем управлять ими.
После разбора каждого типа автор показывает, что чистый SQL-код не является единственным инструментом разработчика. Графические оболочки, такие как Management Studio, избавляют от рутины и генерируют корректные DDL-скрипты. Этот навык особенно ценен в промышленной среде, где скорость и минимизация ошибок важны. Демонстрируется конкретный пример: создание базы данных через интерфейс и получение полного кода со всеми специфическими для T-SQL параметрами.
Далее раскрывается фундаментальная проблема переносимости: стандарт SQL дополняется вендорскими расширениями, количество которых настолько велико, что полное знание всех диалектов недостижимо. Выходом служит концептуальный подход: понимание общей модели языка и принципов работы реляционных СУБД. Такое понимание превращает любой незнакомый параметр в легко исследуемый объект – достаточно обратиться к документации конкретного диалекта. Приводится пример с параметром ANSI_PADDING, который регулирует хранение коротких строк и имеет разное поведение в разных СУБД.
Практическая ценность материала в том, что он формирует не механическое запоминание команд, а метанавык: умение различать универсальное ядро SQL и диалектные надстройки, использовать графический инструментарий для ускорения разработки и обращаться к документации для точечного решения задач. Этот подход одинаково применим при работе с любой реляционной платформой – будь то SQL Server, Oracle, PostgreSQL или MySQL. Наконец, чёткое разделение на DDL и DML закладывает правильную ментальную модель: сначала создаётся и изменяется структура хранения, а затем в этих рамках ведутся операции над данными.
1. Ограничения целостности бывают четырёх типов: PRIMARY KEY, UNIQUE, CHECK, FOREIGN KEY.
2. PRIMARY KEY автоматически включает условия NOT NULL и UNIQUE.
3. Любое ограничение при создании должно получить уникальное имя.
4. Добавить ограничение к существующей таблице можно командой ALTER TABLE … ADD CONSTRAINT.
5. В условии CHECK допустимы подзапросы к другим таблицам, что позволяет строить сложную логику проверки.
6. FOREIGN KEY связывает дочернее поле с родительским ключом, обычно первичным ключом другой таблицы.
7. Все операции DDL (CREATE, ALTER, DROP) единообразно применяются к таблицам, представлениям, процедурам, триггерам и индексам.
8. Графический клиент (Management Studio) умеет генерировать готовый SQL-скрипт по действиям пользователя.
9. Параметры, сгенерированные GUI, часто специфичны для конкретного диалекта и не входят в стандарт SQL.
10. Полное знание всех диалектов SQL недостижимо из-за их объёма и постоянного обновления.
11. Эффективная стратегия – понимание общих концепций и умение находить в документации особенности нужного диалекта.
12. DML (SELECT, INSERT, UPDATE, DELETE) отвечает за манипулирование данными и является центральной частью языка.
1. Какие четыре типа ограничений поддерживаются в SQL?
2. Чем ограничение UNIQUE отличается от PRIMARY KEY?
3. Как добавить ограничение CHECK к столбцу таблицы, уже содержащей данные?
4. Можно ли в условии CHECK использовать подзапрос, обращающийся к другой таблице?
5. Какой синтаксис применяется для задания внешнего ключа при создании таблицы?
6. Что произойдёт, если попытаться вставить запись с нарушением ограничения FOREIGN KEY?
7. Какие ключевые слова относятся к DDL, а какие к DML?
8. Каким образом графический интерфейс клиента помогает при написании DDL-скриптов?
9. Почему нельзя выучить «весь SQL» одинаково хорошо для всех СУБД?
10. Что означает параметр ANSI_PADDING в контексте T-SQL?
11. Как быстро разобраться в назначении незнакомого параметра конкретной СУБД?
12. Для каких объектов помимо таблиц применимы операции CREATE, ALTER и DROP?