Restrição MySQL CHECK

Resumo : neste tutorial, você aprenderá como usar CHECKa restrição MySQL para garantir que os valores armazenados em uma coluna ou grupo de colunas satisfaçam uma expressão booleana.

MySQL 8.0.16 implementou a restrição de verificação SQL. Se você usa MySQL com versões anteriores, você pode emular uma CHECKrestrição usando uma visualização WITH CHECK OPTION ou um gatilho .

Introdução à restrição MySQL CHECK

Antes do MySQL 8.0.16, CREATE TABLEpermite incluir uma CHECKrestrição de tabela. No entanto, o MySQL ignora todas as CHECKrestrições:

CHECK(expression)Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

A partir do MySQL 8.0.16, os CREATE TABLErecursos essenciais suportados de CHECKrestrições de tabela e coluna para todos os mecanismos de armazenamento .

Aqui está a sintaxe básica:

CONSTRAINT constraint_name 
CHECK (expression) 
[ENFORCED | NOT ENFORCED]Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Nesta sintaxe:

Primeiro, especifique o nome da restrição de verificação que deseja criar após a CONSTRAINTpalavra-chave. Se você omitir o nome da restrição, o MySQL gera automaticamente um nome com a seguinte convenção:

table_name_chk_nLinguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Nesta convenção, né um número ordinal como 1,2 e 3. Por exemplo, os nomes de CHECKrestrições da partstabela gerados automaticamente serão parts_chk_1, parts_chk_2e assim por diante.

Segundo, especifique um booleano expressionque deve ser avaliado para TRUEou UNKNOWNpara cada linha da tabela entre parênteses após a CHECKpalavra-chave.

Se a expressão for avaliada como FALSE, os valores violam a restrição ou ocorre uma violação da restrição.

Observe que o MySQL trata 1 como verdadeiro e 0 como falso.

Terceiro, especifique opcionalmente a cláusula de execução para indicar se a restrição de verificação é aplicada:

  • Use ENFORCEDou omita a ENFORCEDcláusula para criar e impor a restrição.
  • Use NOT ENFORCEDpara criar a restrição, mas não aplicá-la.

Conforme mencionado anteriormente, você pode definir uma CHECKrestrição como uma restrição de tabela ou uma restrição de coluna.

Uma CHECKrestrição de tabela pode fazer referência a várias colunas, enquanto a CHECKrestrição de coluna pode fazer referência à única coluna onde está definida.

Exemplos de restrições CHECK do MySQL

Vejamos alguns exemplos de uso das CHECKrestrições.

1) Criando restrições CHECK como restrições de coluna

A seguinte instrução CREATE TABLE cria uma nova tabela chamada parts:

CREATE TABLE parts (
    part_no VARCHAR(18) PRIMARY KEY,
    description VARCHAR(40),
    cost DECIMAL(10,2 ) NOT NULL CHECK (cost >= 0),
    price DECIMAL(10,2) NOT NULL CHECK (price >= 0)
);Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

A tabela de peças possui duas CHECKrestrições de coluna: uma para a costcoluna e outra para a pricecoluna.

Como não especificamos explicitamente os nomes das CHECKrestrições, o MySQL gerou nomes automaticamente para elas.

Para visualizar a definição da tabela com o CHECKnome da restrição, use a SHOW CREATE TABLEinstrução:

SHOW CREATE TABLE parts;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Saída:

restrição de verificação do mysql

A saída indica que o MySQL gerou os nomes ( parts_chk_1e parts_chk_2) para as restrições de verificação.

Após criar CHECKrestrições, se você inserir ou atualizar um valor que faça com que a expressão booleana seja falsa, o MySQL rejeitará a alteração e emitirá um erro.

Esta instrução insere uma nova linha na partstabela:

INSERT INTO parts(part_no, description,cost,price) 
VALUES('A-001','Cooler',0,-100);Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

MySQL emitiu um erro:

Error Code: 3819. Check constraint 'parts_chk_2' is violated.Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Como o valor da pricecoluna é negativo, o que faz com que a expressão price > 0seja avaliada como FALSEresultado de uma violação de restrição.

2) Criando restrições CHECK como restrições de tabela

Primeiro, elimine a partstabela:

DROP TABLE IF EXISTS parts;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Em seguida, crie uma nova partstabela com mais uma CHECKrestrição de tabela:

CREATE TABLE parts (
    part_no VARCHAR(18) PRIMARY KEY,
    description VARCHAR(40),
    cost DECIMAL(10,2 ) NOT NULL CHECK (cost >= 0),
    price DECIMAL(10,2) NOT NULL CHECK (price >= 0),
    CONSTRAINT parts_chk_price_gt_cost 
        CHECK(price >= cost)
);Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

A nova cláusula a seguir define uma CHECKrestrição de tabela que garante que o preço seja sempre maior ou igual ao custo:

CONSTRAINT parts_chk_price_gt_cost CHECK(price >= cost)Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Como especificamos explicitamente o nome da CHECKrestrição, o MySQL cria a nova restrição com o nome especificado.

Aqui está a definição da partstabela:

SHOW CREATE TABLE parts;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

A CHECKrestrição da tabela aparece no final da definição da tabela, após a lista de colunas.

Esta afirmação tenta inserir uma nova peça cujo preço é menor que o custo:

INSERT INTO parts(part_no, description,cost,price) 
VALUES('A-001','Cooler',200,100);Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Aqui está o erro devido à violação da restrição:

Error Code: 3819. Check constraint 'parts_chk_price_gt_cost' is violated.Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Adicionando uma restrição de verificação a uma tabela

Para adicionar uma restrição de verificação a uma tabela existente, você usa a ALTER TABLE ... ADD CHECKinstrução:

ALTER TABLE table_name
ADD CHECK (expression);Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Se quiser especificar explicitamente o nome da CHECKrestrição, você pode usar a ALTER TABLE ... ADD CONSTRAINT ... CHECKinstrução:

ALTER TABLE table_name
ADD CONSTRAINT contraint_name
CHECK (expression);Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Por exemplo, a instrução a seguir adiciona uma CHECKrestrição à partstabela:

ALTER TABLE parts
ADD CHECK (part_no <> description);Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Essa CHECKrestrição impede que você tenha o part_nomesmo arquivo description.

Por exemplo, a seguinte INSERTdeclaração será rejeitada:

INSERT INTO parts 
VALUES('A','A',100,120);Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Saída:

ERROR 3819 (HY000): Check constraint 'parts_chk_3' is violated.Linguagem de código:  JavaScript  ( javascript )

Removendo uma restrição de verificação de uma tabela

Para remover uma CHECKrestrição de uma tabela, você usa a ALTER TABLE ... DROP CHECKinstrução:

ALTER TABLE table_name
DROP CHECK constraint_name;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Por exemplo, a instrução a seguir remove a CHECKrestrição parts_chk_3da tabela de peças:

ALTER TABLE parts
DROP CHECK parts_chk_3;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Resumo

  • Use CHECKrestrições para garantir que os valores armazenados em uma coluna satisfaçam uma condição booleana.
  • Use CHECK(expression)para definir uma CHECKrestrição.
  • Use ALTER TABLE ... ADD CHECKpara adicionar uma CHECKrestrição a uma tabela.
  • Use ALTER TABLE ... DROP CHECKpara remover uma CHECKrestrição de uma tabela.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *