Что такое CONSTRAINT в SQL?

«Что такое CONSTRAINT в SQL?» — вопрос из категории Базы данных и SQL, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

CONSTRAINT (Ограничение) в SQL — это правило, применяемое к столбцам или таблицам для обеспечения целостности и согласованности данных. При тестировании приложений, работающих с БД, проверка соблюдения этих ограничений — одна из ключевых задач. Я всегда включаю в тестовые сценарии попытки нарушить каждое из них.

Основные типы ограничений и как я их тестирую:

Ограничение Назначение Пример тестового сценария (негативный кейс)
PRIMARY KEY Уникально идентифицирует строку. Запрещает NULL и дубликаты. Попытка вставить две строки с одинаковым id. Ожидается ошибка нарушения первичного ключа.
FOREIGN KEY Обеспечивает ссылочную целостность между таблицами. Попытка вставить запись в Orders с несуществующим customer_id. Попытка удалить клиента, на которого есть ссылки в заказах (проверка ON DELETE правила).
UNIQUE Гарантирует уникальность значений в столбце/группе столбцов. Попытка зарегистрировать двух пользователей с одним email.
NOT NULL Запрещает вставку NULL в столбец. Попытка создать запись пользователя, не указав обязательное поле username.
CHECK Проверяет значение по заданному условию. Попытка установить отрицательное значение для age или salary.

Пример создания таблицы с ограничениями, которую я мог бы использовать в тестовой базе:

CREATE TABLE Employees (
    id INT PRIMARY KEY,  -- PK
    email VARCHAR(255) NOT NULL UNIQUE,  -- NOT NULL + UNIQUE
    department_id INT NOT NULL,
    salary DECIMAL(10,2) CHECK (salary >= 0),  -- CHECK
    CONSTRAINT fk_department 
        FOREIGN KEY (department_id) 
        REFERENCES Departments(id) 
        ON DELETE RESTRICT  -- Проверяем это поведение
);

В процессе тестирования я не только проверяю, что БД блокирует невалидные операции, но и анализирую качество сообщений об ошибках, которые возвращает СУБД и, в свою очередь, наше приложение — они должны быть понятны для логирования и отладки.