← Назад к вопросам

Приведи пример CONSTRAINT

2.0 Middle🔥 151 комментариев
#Базы данных и SQL

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Пример использования CONSTRAINT в SQL

CONSTRAINT (ограничение) в SQL — это правило, которое применяется к данным в таблице для обеспечения их целостности и точности. Ограничения могут определяться на уровне столбца или таблицы. Вот практический пример создания таблицы с несколькими типами ограничений.

Пример таблицы employees с различными CONSTRAINT

CREATE TABLE employees (
    employee_id INT PRIMARY KEY,                         -- 1. Первичный ключ (PRIMARY KEY CONSTRAINT)
    first_name VARCHAR(50) NOT NULL,                     -- 2. Ограничение NOT NULL
    last_name VARCHAR(50) NOT NULL,
    email VARCHAR(100) UNIQUE,                           -- 3. Уникальность (UNIQUE CONSTRAINT)
    phone VARCHAR(20),
    department_id INT,
    hire_date DATE DEFAULT CURRENT_DATE,                 -- 4. Значение по умолчанию (DEFAULT CONSTRAINT)
    salary DECIMAL(10, 2) CHECK (salary > 0),            -- 5. Проверка условия (CHECK CONSTRAINT)
    
    -- 6. Внешний ключ (FOREIGN KEY CONSTRAINT) на уровне таблицы
    CONSTRAINT fk_department 
        FOREIGN KEY (department_id) 
        REFERENCES departments(department_id)
        ON DELETE SET NULL,
    
    -- 7. Композитный CHECK CONSTRAINT
    CONSTRAINT chk_name_length 
        CHECK (LENGTH(first_name) > 1 AND LENGTH(last_name) >: 1),
    
    -- 8. Уникальная комбинация (COMPOSITE UNIQUE CONSTRAINT)
    CONSTRAINT unq_phone_department 
        UNIQUE (phone, department_id)
);

Подробное объяснение каждого ограничения

  1. PRIMARY KEY:

    • Гарантирует уникальность и недопустимость NULL значений для employee_id.
    • Автоматически создаёт кластеризованный индекс (в большинстве СУБД).
  2. NOT NULL:

    • Обеспечивает обязательное заполнение столбцов first_name и last_name.
  3. UNIQUE:

    • Гарантирует, что все значения в столбце email будут уникальными (но допускает NULL).
  4. DEFAULT:

    • Если при вставке не указано значение для hire_date, автоматически устанавливается текущая дата.
  5. CHECK на уровне столбца:

    • Проверяет, что значение salary всегда больше 0.
  6. FOREIGN KEY:

    • Связывает department_id с первичным ключом таблицы departments.
    • ON DELETE SET NULL означает, что при удалении департамента, department_id у сотрудника станет NULL.
  7. CHECK на уровне таблицы:

    • Проверяет, что и имя, и фамилия имеют длину более 1 символа.
    • Позволяет описывать сложные условия, затрагивающие несколько столбцов.
  8. Композитный UNIQUE:

    • Гарантирует уникальность комбинации phone и department_id.
    • Позволяет иметь одинаковые номера телефонов в разных департаментах, но не в одном.

Дополнительные операции с CONSTRAINT

Добавление ограничения после создания таблицы:

ALTER TABLE employees
ADD CONSTRAINT chk_salary_cap 
    CHECK (salary < 100000);

Удаление ограничения:

ALTER TABLE employees
DROP CONSTRAINT chk_salary_cap;

Отключение и включение ограничений (в некоторых СУБД):

-- Отключение FOREIGN KEY (например, в SQL Server)
ALTER TABLE employees
NOCHECK CONSTRAINT fk_department;

-- Включение обратно
ALTER TABLE employees
CHECK CONSTRAINT fk_department;

Важность CONSTRAINT в тестировании (QA Perspective)

С точки зрения QA Automation Engineer, понимание ограничений критически важно для:

  • Проектирования тестовых данных – создание данных, которые нарушают и соответствуют ограничениям.
  • Валидации интеграционных тестов – проверка, что бизнес-логика приложения корректно обрабатывает ошибки БД (например, нарушение UNIQUE или FOREIGN KEY).
  • Написания скриптов миграции БД – проверка, что новые ограничения не конфликтуют с существующими данными.
  • Тестирования производительности – индексы, создаваемые автоматически для PRIMARY KEY и UNIQUE, влияют на скорость запросов.

Ограничения обеспечивают целостность данных на уровне базы, что является последней линией защиты от некорретных данных, даже если в приложении есть баги. Поэтому тестирование сценариев, которые должны вызывать нарушения CONSTRAINT, – обязательная часть тестирования Backend и API.