Ответ
Помимо перечисленных, ключевыми ограничениями в SQL являются FOREIGN KEY и DEFAULT.
1. FOREIGN KEY (Внешний ключ)
Обеспечивает ссылочную целостность данных. Связывает поле (или группу полей) в одной таблице (дочерней) с PRIMARY KEY или UNIQUE полем в другой таблице (родительской).
Пример создания:
CREATE TABLE departments (
dept_id INT PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
CREATE TABLE employees (
emp_id INT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
dept_id INT,
CONSTRAINT fk_employee_department
FOREIGN KEY (dept_id)
REFERENCES departments(dept_id)
ON DELETE CASCADE
);
Действия при изменении/удалении (ON DELETE / ON UPDATE):
CASCADE– удалить/обновить связанные строки в дочерней таблице.SET NULL– установитьNULLв дочерней таблице.RESTRICT/NO ACTION– запретить операцию, если есть зависимости.SET DEFAULT– установить значение по умолчанию.
2. DEFAULT
Задает значение по умолчанию для столбца, которое используется, если при вставке строки значение для этого столбца не указано.
Пример:
CREATE TABLE orders (
order_id INT PRIMARY KEY,
order_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
status VARCHAR(20) DEFAULT 'PENDING',
total_amount DECIMAL(10,2) DEFAULT 0.00
);
-- При вставке order_date и status будут заполнены автоматически
INSERT INTO orders (order_id) VALUES (1001); Ответ 18+ 🔞
А, ну так вот, смотри, кроме этих всех NOT NULL и CHECK, есть ещё две штуки, которые реально жизнь упрощают, а иногда и наоборот, блядь. FOREIGN KEY и DEFAULT. Вот про них сейчас и поговорим, пока мозг не закипел.
1. FOREIGN KEY (Внешний ключ, он же наш заграничный друг)
Это такая хуйня, которая не даёт тебе записать в таблицу какую-нибудь ахинею, которой нет в другой таблице. Типа ссылочная целостность, ёпта. Связывает поле в одной таблице (дочерней, как сын-подзаборник) с PRIMARY KEY в другой (родительской, как строгий отец).
Вот смотри, как это выглядит вживую:
CREATE TABLE departments (
dept_id INT PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
CREATE TABLE employees (
emp_id INT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
dept_id INT,
CONSTRAINT fk_employee_department
FOREIGN KEY (dept_id)
REFERENCES departments(dept_id)
ON DELETE CASCADE
);
Видишь? dept_id в employees теперь не просто циферка. Это ссылка, блядь. Нельзя записать сотрудника в отдел с номером 666, если в таблице departments такого отдела нет. База тебе сразу: «Нихуя, дружок, куда прешь? Сначала отдел создай, потом людей туда сей».
А эта строчка ON DELETE CASCADE — это просто песня. Это значит: «Если удалят отдел, то всех сотрудников из него — нахуй, в небытие, автоматом». Есть и другие варианты, конечно:
SET NULL– сотрудникам в графе «отдел» просто пишутNULL. Сидят, бедолаги, безработные.RESTRICT/NO ACTION– самый умный. Не даст удалить отдел, пока в нём хоть один человек сидит. «Сначала уволь всех, мудак, потом отдел ликвидируй».SET DEFAULT– ну, установит какое-то дефолтное значение. Редко кто использует, честно говоря.
2. DEFAULT (Значение по умолчанию, оно же «автозаполнитель для ленивых»)
Вот это реально удобная штука, ебать мои старые костыли. Назначаешь столбцу значение, которое подставится само, если ты его не указал. Чтоб не писать одно и то же по сто раз.
Пример из жизни:
CREATE TABLE orders (
order_id INT PRIMARY KEY,
order_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- Текущая дата-время сама встанет
status VARCHAR(20) DEFAULT 'PENDING', -- Статус «В ожидании» по умолчанию
total_amount DECIMAL(10,2) DEFAULT 0.00 -- Сумма ноль, логично же
);
-- И теперь можно вставлять заказ, указав только айдишник. Остальное само!
INSERT INTO orders (order_id) VALUES (1001);
Вот и всё. Заказ создан, дата проставлена, статус «PENDING», сумма ноль. Красота, блядь. Не надо городить огород. Главное — понимать, где это применять, а то наставишь дефолтов, а потом удивляешься, почему все заказы с нулевой суммой и статусом «в ожидании» до скончания веков.