Ограничения (Constraints): PRIMARY KEY, FOREIGN KEY, UNIQUE, NOT NULL, DEFAULT
🔑 Введение в ограничения (Constraints)
Ограничения — это правила, которые мы накладываем на данные в таблицах. Они помогают поддерживать целостность данных и избегать ошибок. Представь, что это как правила дорожного движения, но для твоей базы данных! 🚦
В SQL есть пять основных ограничений:
PRIMARY KEY— главный ключFOREIGN KEY— внешний ключUNIQUE— уникальностьNOT NULL— запрет на пустые значенияDEFAULT— значение по умолчанию
Разберём каждое на примерах!
🏆 PRIMARY KEY — главный идентификатор
Это столбец (или группа столбцов), который однозначно идентифицирует каждую строку в таблице. Как паспорт для человека!
CREATE TABLE users (
user_id INT PRIMARY KEY, -- Это наш главный ключ
username VARCHAR(50),
email VARCHAR(100)
);
Особенности PRIMARY KEY:
- ❌ Не может быть
NULL - 🔄 Должен быть уникальным для каждой строки
- 🏷️ В таблице может быть только один PRIMARY KEY
Пример с составным ключом:
CREATE TABLE order_items (
order_id INT,
product_id INT,
quantity INT,
PRIMARY KEY (order_id, product_id) -- Составной ключ из двух полей
);
🌉 FOREIGN KEY — связь между таблицами
Это поле, которое ссылается на PRIMARY KEY другой таблицы. Создаёт отношение "родитель-потомок" между таблицами.
CREATE TABLE orders (
order_id INT PRIMARY KEY,
user_id INT,
order_date DATE,
FOREIGN KEY (user_id) REFERENCES users(user_id) -- Связь с таблицей users
);
Что происходит, если:
- Попытаться удалить запись в
users, на которую ссылаетсяorders? - По умолчанию — ошибка! Но можно настроить поведение:
FOREIGN KEY (user_id) REFERENCES users(user_id)
ON DELETE CASCADE -- Удалит связанные записи автоматически
Другие варианты:
ON DELETE SET NULL— установит NULL вместо удаленияON DELETE NO ACTION— запретит удаление (по умолчанию)
🦄 UNIQUE — гарантия уникальности
Гарантирует, что все значения в столбце будут разными. В отличие от PRIMARY KEY, может быть NULL (но только один NULL!).
CREATE TABLE products (
product_id INT PRIMARY KEY,
product_code VARCHAR(20) UNIQUE, -- Код товара должен быть уникальным
name VARCHAR(100)
);
Практическое применение:
- Электронные почты пользователей
- Номера телефонов
- Артикулы товаров
🚫 NOT NULL — запрет на пустые значения
Простое, но мощное ограничение — поле не может содержать NULL.
CREATE TABLE employees (
employee_id INT PRIMARY KEY,
first_name VARCHAR(50) NOT NULL, -- Имя обязательно!
last_name VARCHAR(50) NOT NULL,
hire_date DATE NOT NULL
);
Совет: Почти всегда PRIMARY KEY поля должны быть NOT NULL, но SQL делает это автоматически.
⚖️ DEFAULT — значение по умолчанию
Устанавливает значение, которое будет использоваться, если при вставке оно не указано.
CREATE TABLE blog_posts (
post_id INT PRIMARY KEY,
title VARCHAR(200) NOT NULL,
content TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- Автоматическая дата создания
is_published BOOLEAN DEFAULT FALSE
);
Работа с DEFAULT:
-- При вставке можно явно указать DEFAULT
INSERT INTO blog_posts (post_id, title)
VALUES (1, 'Мой первый пост', DEFAULT, DEFAULT);
-- Или просто опустить эти поля
INSERT INTO blog_posts (post_id, title)
VALUES (2, 'Второй пост');
🧩 Комбинирование ограничений
Ограничения можно комбинировать для создания точных правил:
CREATE TABLE bank_accounts (
account_id INT PRIMARY KEY,
account_number VARCHAR(20) UNIQUE NOT NULL, -- И уникальный, и обязательный
balance DECIMAL(15,2) DEFAULT 0.00,
client_id INT NOT NULL,
FOREIGN KEY (client_id) REFERENCES clients(client_id)
);
Почему это мощно? Такая таблица будет:
- Гарантировать уникальность account_id и account_number
- Не позволит создать счёт без номера и клиента
- У новых счетов баланс будет 0, если не указан иной
- Не позволит ссылаться на несуществующих клиентов
💡 Главные выводы
- PRIMARY KEY — твой главный идентификатор, уникальный и обязательный
- FOREIGN KEY — создаёт связи между таблицами, поддерживает целостность данных
- UNIQUE — гарантирует уникальность, но разрешает один NULL
- NOT NULL — простое, но важное ограничение против пустых значений
- DEFAULT — умолчательные значения экономят время и предотвращают ошибки
Попробуй применить эти ограничения в своём следующем проекте — они сделают твою базу данных надёжной и предсказуемой! 🛡️