Ответ
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 -- Проверяем это поведение
);
В процессе тестирования я не только проверяю, что БД блокирует невалидные операции, но и анализирую качество сообщений об ошибках, которые возвращает СУБД и, в свою очередь, наше приложение — они должны быть понятны для логирования и отладки.