Что такое ограничения (constraints) в реляционных базах данных?

Ответ

Ограничения (Constraints) — это правила, накладываемые на данные в таблицах реляционной БД для обеспечения целостности данных (data integrity). Они автоматически проверяются СУБД при операциях вставки, обновления или удаления.

Основные типы ограничений в SQL:

Ограничение Назначение Пример SQL (CREATE TABLE)
PRIMARY KEY Уникально идентифицирует каждую строку. Не допускает NULL и дубликаты. id INT PRIMARY KEY
FOREIGN KEY Обеспечивает ссылочную целостность. Связывает поле с PRIMARY KEY другой таблицы. FOREIGN KEY (user_id) REFERENCES Users(id)
NOT NULL Запрещает полю содержать значение NULL. name VARCHAR(100) NOT NULL
UNIQUE Гарантирует, что все значения в столбце различны (допускается один NULL). email VARCHAR(255) UNIQUE
CHECK Проверяет значение по заданному логическому условию. age INT CHECK (age >= 18)
DEFAULT Устанавливает значение по умолчанию для столбца, если оно не указано при вставке. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP

Практический пример с несколькими ограничениями:

CREATE TABLE Employees (
    emp_id INT PRIMARY KEY,                     -- Уникальный идентификатор
    name VARCHAR(100) NOT NULL,                 -- Имя обязательно
    email VARCHAR(255) UNIQUE NOT NULL,         -- Уникальный и обязательный email
    department_id INT,                          -- Может быть NULL, если сотрудник без отдела
    salary DECIMAL(10,2) CHECK (salary > 0),   -- Зарплата должна быть положительной
    hire_date DATE DEFAULT (CURRENT_DATE),      -- Дата приема по умолчанию — сегодня
    FOREIGN KEY (department_id) REFERENCES Departments(id) -- Связь с таблицей отделов
);

Итог: Ограничения переносят логику проверки данных с уровня приложения на уровень БД, что делает данные более надежными и согласованными.

Ответ 18+ 🔞

А, слушай, про ограничения в базах данных! Ну это ж, блядь, святое! Это как правила в твоём доме, которые не дают твоему соседу-алкашу засрать тебе холодильник пивом, а потом сказать, что это квас.

Вот представь, у тебя есть таблица, например, Сотрудники. И туда какой-нибудь Васян-распиздяй может записать себя как угодно. Возраст — минус пять лет, зарплата — три бутылки, а email — «пошел_нахуй@». И что, блядь, мы с этим делать будем? А ничего! Пиздец и бардак.

Вот для этого и придумали ограничения (constraints). Это такие суровые бабайки от СУБД, которые стоят на страже порядка и целостности данных. Они смотрят на каждую вставленную или изменённую запись и говорят: «А ну-ка, пиздуй сюда, давай проверим, ты кто такой?».

Основные типы этих охранников:

Ограничение Что делает? Пример на SQL (CREATE TABLE)
PRIMARY KEY Это главный паспорт строки. Без него — ты бомж, нихуя не личность. Не может быть NULL и повторяться. id INT PRIMARY KEY
FOREIGN KEY О, это уже связи, блядь! Ссылочная целостность. Не даёт тебе записать в поле user_id цифру, которой нет в таблице пользователей. Следит, чтобы ты не сослался в никуда, как дурак. FOREIGN KEY (user_id) REFERENCES Users(id)
NOT NULL Самый простой охранник. «Поле не может быть пустым, мудила! Заполняй!». name VARCHAR(100) NOT NULL
UNIQUE «Уникальность, сука!». Все значения в столбце должны быть разными. Два одинаковых email? Иди нахуй, регистрируйся заново. email VARCHAR(255) UNIQUE
CHECK Вот это уже логика, ёпта! Проверяет значение по условию. Возраст больше 18? Зарплата не отрицательная? А то щас как впендюрю! age INT CHECK (age >= 18)
DEFAULT Ленивый, но добрый охранник. Если ты ничего не указал, он сам подставит стандартное значение. «Да похуй, пусть будет сегодняшняя дата». created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP

Вот тебе живой пример, как это всё вместе работает:

CREATE TABLE Employees (
    emp_id INT PRIMARY KEY,                     -- Это твой служебный номер, уникальный и ебать он обязателен
    name VARCHAR(100) NOT NULL,                 -- Без имени — ты анонимный пидор, не подходи
    email VARCHAR(255) UNIQUE NOT NULL,         -- Почта должна быть и одна на всех, чтоб не было клонов
    department_id INT,                          -- А вот отдел может быть и NULL, если ты пока бездельник
    salary DECIMAL(10,2) CHECK (salary > 0),   -- Зарплата положительная, иначе это не зарплата, а долг, ебанашка
    hire_date DATE DEFAULT (CURRENT_DATE),      -- Дата приёма — сегодня, если не указал другую (лень, блядь, было?)
    FOREIGN KEY (department_id) REFERENCES Departments(id) -- А это связь. Не даст тебе приписать себя к отделу-призраку.
);

Итог, блядь: Ограничения — это офигенная штука. Они переносят всю эту ебучую логику проверок с твоего кривого кода в приложении прямо в ядро базы данных. Данные становятся надёжными, согласованными, и ты можешь спать спокойно, не боясь, что завтра в отчёте появится сотрудник с зарплатой в «пиздец денег» и датой рождения 32 июня. Чихать тебе в сраку, Васян!