13.1.20.6 CHECK Constraints
Prior to MySQL 8.0.16, CREATE TABLE
permits only the following limited version of table CHECK
constraint syntax, which is parsed and ignored:
CHECK (expr)
As of MySQL 8.0.16, CREATE TABLE
permits the core features of table and column CHECK
constraints, for all storage engines. CREATE TABLE
permite o seguinte CHECK
restrição de sintaxe, para ambas as restrições de tabela e de coluna restrições:
] CHECK (expr) ENFORCED]
opcional symbol
especifica um nome para a restrição. Se omitido, MySQL gera um nome do nome da tabela, um literal _chk_
, e um número ordinal (1, 2, 3, …). Os nomes de restrições têm um comprimento máximo de 64 caracteres. São sensíveis à capitalização, mas não ao sotaque.
expr
especifica a condição de restrição como uma expressão booleana que deve avaliar a TRUE
ou UNKNOWN
(de NULL
valores) para cada linha da tabela. Se a condição for avaliada para FALSE
, ela falha e uma violação de restrição ocorre. O efeito de uma violação depende da declaração a ser executada, como descrito mais tarde nesta seção.
a cláusula de execução facultativa indica se a restrição é aplicada:
-
Se omitido ou especificado como
ENFORCED
, a restrição é criada e imposta. -
Se especificado como
NOT ENFORCED
, a restrição é criada mas não executada.
Uma CHECK
restrição é especificada como uma restrição de tabela ou de restrição de coluna:
-
Uma restrição de tabela não aparecer dentro de uma definição de coluna e pode se referir a qualquer coluna da tabela ou colunas. As referências Forward são permitidas às colunas que aparecem mais tarde na definição da tabela.
-
uma restrição de coluna aparece dentro de uma definição de coluna e pode referir-se apenas a essa coluna.
Considerar esta definição de tabela:
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));
A definição inclui as restrições de tabela e de coluna restrições, em nome e sem nome formatos:
-
A primeira restrição é uma restrição de tabela: ocorre fora de qualquer definição de coluna, assim, ele pode (e faz) referem-se a várias colunas de uma tabela. Esta restrição contém referências forward às colunas ainda não definidas. Não foi indicado nenhum nome de restrição, por isso o MySQL gera um nome.
-
As Três restrições seguintes são restrições de coluna: cada uma ocorre dentro de uma definição de coluna, e assim pode se referir apenas à coluna sendo definida. Uma das restrições é nomeada explicitamente. MySQL gera um nome para cada um dos outros dois.
-
as duas últimas restrições São restrições de tabela. Um deles é mencionado explicitamente. MySQL gera um nome para o outro.
conforme mencionado, MySQL gera um nome para qualquer restriçãoCHECK
especificada sem uma restrição. Para ver os nomes gerados para a anterior definição de tabela, use SHOW CREATE TABLE
:
mysql> SHOW CREATE TABLE t1\G*************************** 1. row *************************** Table: t1Create 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
O padrão SQL especifica que todos os tipos de restrições (chave primária único índice, chave estrangeira, cheque) pertencem ao mesmo espaço de nomes. No MySQL, cada tipo de restrição tem seu próprio espaço de nomes por esquema (banco de dados). Consequentemente, CHECK
os nomes de restrições devem ser únicos por esquema; no two tables in the same schema can share a CHECK
constraint name. (Exception: a TEMPORARY
table hides a non-TEMPORARY
table of the same name, so it can have the same CHECK
constraint names as well.)
iniciando os nomes de restrições geradas com o nome da tabela ajuda a garantir unicidade esquema porque os nomes de tabelas também devem ser únicos dentro do esquema.
CHECK
as expressões de condição devem aderir às seguintes regras. Um erro ocorre se uma expressão contém construções não autorizadas.
-
colunas não engendradas e geradas são permitidas, exceto colunas com
AUTO_INCREMENT
atributo e Colunas noutros quadros. -
Literals, deterministic built-in functions, and operators are allowed. Uma função é determinística se, dados os mesmos dados em tabelas, várias invocações produzem o mesmo resultado, independentemente do usuário conectado. Exemplos de funções que são não-determinísticas e falham nesta definição:
CONNECTION_ID()
NOW()
. não são permitidas funções armazenadas e funções definidas pelo utilizador. não são permitidos procedimentos e parâmetros de função armazenados em -
. não são permitidas variáveis
-
(variáveis do sistema, variáveis definidas pelo utilizador e variáveis locais armazenadas do programa). não são permitidas subcontas de
-
.
referencial de chave Estrangeira de ações (ON UPDATE
ON DELETE
), são proibidos nas colunas usadas em CHECK
restrições. Likewise, CHECK
constraints are prohibited on columns used in foreign key referential actions.
CHECK
constraints are evaluated for INSERT
UPDATE
REPLACE
LOAD DATA
, and LOAD XML
statements and an error occurs if a constraint evaluates to FALSE
. Se ocorrer um erro, o tratamento das alterações já aplicadas difere para motores de armazenamento transacional e não transacional, e também depende se o modo SQL estrito está em efeito, como descrito no modo SQL estrito.
CHECK
restrições são avaliadas por INSERT IGNORE
UPDATE IGNORE
LOAD DATA ... IGNORE
e LOAD XML ... IGNORE
instruções e um aviso ocorre se uma restrição de avalia FALSE
. A inserção ou actualização de qualquer linha offending é ignorada.
Se a expressão de restrição avalia para um tipo de dados que difere do tipo de coluna declarado, coerção implícita para o tipo declarado ocorre de acordo com as regras usuais de Conversão de tipo MySQL. Ver Ponto 12.3, “conversão do tipo em Avaliação da expressão”. Se a conversão de tipo falhar ou resultar em uma perda de precisão, um erro ocorre.
avaliação da expressão de restrição usa o modo SQL em efeito no momento da avaliação. Se algum componente da expressão depender do modo SQL, podem ocorrer resultados diferentes para diferentes utilizações da tabela, a menos que o modo SQL seja o mesmo durante todas as utilizações.