MySQL :: MySQL 8.0 Reference Manual :: 13.1.20.6 CHECK Constraints

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 UPDATEON 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 INSERTUPDATEREPLACELOAD 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 IGNOREUPDATE IGNORELOAD 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.

Nota

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.

Deixe uma resposta

O seu endereço de email não será publicado.