Что такое CHECK-ограничение в SQL?sql-88

CHECK-ограничение — это механизм валидации данных на уровне таблицы в SQL Server, который гарантирует, что значения в столбце удовлетворяют определенному логическому условию. Это декларативный способ обеспечения целостности данных без необходимости написания триггеров или процедур.

Основные характеристики CHECK-ограничений

  1. Уровень проверки:

    • Может быть применено к отдельному столбцу или всей таблице
    • Выполняется при INSERT и UPDATE операциях
  2. Условия:

    • Использует логические выражения (возвращающие TRUE/FALSE)
    • Может включать несколько столбцов
    • Пример:
      CONSTRAINT CHK_Price CHECK (Price > 0 AND Price < 10000)
      

Синтаксис создания

При создании таблицы:

CREATE TABLE Products (
    ProductID INT PRIMARY KEY,
    ProductName NVARCHAR(100),
    Price DECIMAL(10,2) CHECK (Price > 0),
    Discount DECIMAL(10,2),
    CONSTRAINT CHK_Discount CHECK (Discount >= 0 AND Discount <= Price)
)

Для существующей таблицы:

ALTER TABLE Employees
ADD CONSTRAINT CHK_Age
CHECK (DATEDIFF(YEAR, BirthDate, GETDATE()) BETWEEN 18 AND 70)

Практические примеры

  1. Проверка формата:

    CONSTRAINT CHK_Email CHECK (Email LIKE '%_@__%.__%')
    
  2. Сложные бизнес-правила:

    CONSTRAINT CHK_OrderDates CHECK (
        OrderDate <= RequiredDate AND
        RequiredDate <= ShippedDate
    )
    
  3. Ограничение по перечислению:

    CONSTRAINT CHK_Status CHECK (
        Status IN ('New', 'Processing', 'Shipped', 'Completed')
    )
    

Особенности работы

  1. NULL-значения:

    • Условие CHECK с NULL оценивается как UNKNOWN
    • Операция допускается, если результат не FALSE
  2. Производительность:

    • Проверка выполняется до модификации данных
    • Менее затратно, чем триггеры
  3. Ограничения:

    • Не может содержать подзапросы
    • Не может ссылаться на другие таблицы
    • Не может использовать недетерминированные функции (например, GETDATE() в некоторых СУБД)

Отключение и повторное включение

-- Временно отключить
ALTER TABLE Products NOCHECK CONSTRAINT CHK_Price

-- Включить обратно
ALTER TABLE Products CHECK CONSTRAINT CHK_Price

Преимущества CHECK-ограничений

  • Централизованное управление: Правила хранятся в метаданных
  • Производительность: Оптимизатор может использовать их для построения планов
  • Читаемость: Явное определение бизнес-правил в структуре таблицы

Резюмируем

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