Spec-Zone.ru › MySQL 8.4

15.1.20.6 Ограничения CHECK

CREATE TABLE позволяет использовать основные функции ограничений таблиц и столбцов CHECK для всех типов движков хранения. CREATE TABLE допускает следующий синтаксис ограничений CHECK для ограничений таблиц и столбцов:

[CONSTRAINT [symbol]] CHECK (expr) [[NOT] ENFORCED]

Необязательный параметр symbol задаёт имя ограничения. Если он опущен, MySQL сгенерирует имя из имени таблицы, литерала _chk_ и порядкового номера (1, 2, 3, ...). Имена ограничений имеют максимальную длину 64 символа. Они чувствительны к регистру, но не к акцентам.

expr задаёт условие ограничения как булево выражение, которое должно оцениваться как TRUE или UNKNOWN (для NULL значений) для каждой строки таблицы. Если условие оценивается как FALSE, оно приводит к ошибке и нарушению ограничения. Последствия нарушения зависят от выполняемого оператора, как описано позже в этом разделе.

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

  • Если она опущена или задана как ENFORCED, ограничение создаётся и применяется.

  • Если она задана как NOT ENFORCED, ограничение создаётся, но не применяется.

Ограничение CHECK задаётся как ограничение таблицы или столбца:

  • Ограничение таблицы не встречается внутри определения столбца и может ссылаться на любой столбец или столбцы таблицы. Разрешаются ссылки вперёд на столбцы, появляющиеся позже в определении таблицы.

  • Ограничение столбца встречается внутри определения столбца и может ссылаться только на этот столбец.

Рассмотрим это определение таблицы:

CREATE TABLE t1
(
  CHECK (c1 <> c2),
  c1 INT CHECK (c1 > 10),
  c2 INT CONSTRAINT c2_positive CHECK (c2 > 0),
  c3 INT CHECK (c3 < 100),
  CONSTRAINT c1_nonzero CHECK (c1 <> 0),
  CHECK (c1 > c3)
);

Определение включает ограничения таблиц и столбцов в именованных и безымянных форматах:

  • Первое ограничение является ограничением таблицы: оно появляется вне любого определения столбца, поэтому может (и делает это) ссылаться на несколько столбцов таблицы. Это ограничение содержит ссылки вперёд на столбцы, которые ещё не определены. Имя ограничения не указано, поэтому MySQL генерирует имя.

  • Следующие три ограничения являются ограничениями столбцов: каждое из них встречается внутри определения столбца и, следовательно, может ссылаться только на определяемый столбец. Одно из ограничений явно названо. MySQL генерирует имя для каждого из других двух.

  • Последние два ограничения — ограничения таблицы. Одно из них явно названо. MySQL генерирует имя для другого.

Как уже упоминалось, MySQL генерирует имя для любого ограничения CHECK, указанного без него. Чтобы увидеть сгенерированные имена для предыдущего определения таблицы, используйте SHOW CREATE TABLE:

mysql> SHOW CREATE TABLE t1\G
*************************** 1. row ***************************
       Table: t1
Create Table: CREATE TABLE `t1` (
  `c1` int(11) DEFAULT NULL,
  `c2` int(11) DEFAULT NULL,
  `c3` int(11) DEFAULT NULL,
  CONSTRAINT `c1_nonzero` CHECK ((`c1` <> 0)),
  CONSTRAINT `c2_positive` CHECK ((`c2` > 0)),
  CONSTRAINT `t1_chk_1` CHECK ((`c1` <> `c2`)),
  CONSTRAINT `t1_chk_2` CHECK ((`c1` > 10)),
  CONSTRAINT `t1_chk_3` CHECK ((`c3` < 100)),
  CONSTRAINT `t1_chk_4` CHECK ((`c1` > `c3`))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

Стандарт SQL определяет, что все типы ограничений (ключ первичности, уникальный индекс, внешний ключ, проверка) принадлежат одному и тому же пространству имён. В MySQL каждый тип ограничения имеет своё собственное пространство имён на схему (базу данных). Следовательно, имена ограничений CHECK должны быть уникальными для каждой схемы; две таблицы в одной схеме не могут иметь одинакового имени ограничения CHECK. (Исключение: таблица TEMPORARY скрывает не-TEMPORARY таблицу с тем же именем, поэтому она также может иметь одинаковые имена ограничений CHECK.)

Начало сгенерированных имён ограничений с именем таблицы помогает обеспечить уникальность схемы, так как имена таблиц также должны быть уникальными в рамках схемы.

Выражения условий CHECK должны соответствовать следующим правилам. Возникает ошибка, если выражение содержит недопустимые конструкции.

  • Разрешены негенерируемые и генерируемые столбцы, за исключением столбцов с атрибутом AUTO_INCREMENT и столбцов в других таблицах.

  • Разрешены литералы, детерминированные встроенные функции и операторы. Функция является детерминированной, если при одинаковых данных в таблицах многократные вызовы возвращают один и тот же результат независимо от подключённого пользователя. Примеры функций, которые являются недетерминированными и не удовлетворяют этому определению: CONNECTION_ID(), CURRENT_USER(), NOW().

  • Хранящиеся функции и загружаемые функции не разрешены.

  • Параметры хранимых процедур и функций не разрешены.

  • Переменные (системные переменные, переменные пользователя и локальные переменные хранимой программы) не разрешены.

  • Подзапросы не разрешены.

Действия ссылок на внешние ключи (ON UPDATE, ON DELETE) запрещены для столбцов, используемых в ограничениях CHECK. Аналогично, ограничения CHECK запрещены для столбцов, используемых в действиях ссылок внешних ключей.

Ограничения CHECK оцениваются для операторов INSERT, UPDATE, REPLACE, LOAD DATA и LOAD XML, и возникает ошибка, если ограничение оценивается как FALSE. Если возникает ошибка, обработка уже применённых изменений отличается для транзакционных и не транзакционных движков хранения, а также зависит от того, включён ли строгий режим SQL, как описано в Строгом режиме SQL.

Ограничения CHECK оцениваются для операторов INSERT IGNORE, UPDATE IGNORE, LOAD DATA ... IGNORE и LOAD XML ... IGNORE, и возникает предупреждение, если ограничение оценивается как FALSE. Вставка или обновление для любой строки-нарушителя пропускается.

Если выражение ограничения оценивается как тип данных, отличный от объявленного типа столбца, происходит неявное приведение к объявленному типу в соответствии с обычными правилами преобразования типов MySQL. См. Раздел 14.3, «Преобразование типов в оценке выражений». Если преобразование типов завершается неудачно или приводит к потере точности, возникает ошибка.

Примечание

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

Таблица схемы информации CHECK_CONSTRAINTS содержит информацию об ограничениях CHECK, определённых в таблицах. См. Раздел 28.3.5, «Таблица INFORMATION_SCHEMA CHECK_CONSTRAINTS».

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/create-table-check-constraints.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API