15.1.21.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 определяет, что все типы ограничений (основной ключ, уникальный индекс, внешний ключ, check) принадлежат одному и тому же пространству имён. В 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.