Resumo :neste tutorial, você aprenderá como usar SQLite
CHECK
restrição para validar dados antes de inserir ou atualizar. Introdução ao SQLite CHECK
restrições
SQLite
CHECK
As restrições permitem que você defina expressões para testar valores sempre que eles forem inseridos ou atualizados em uma coluna. Se os valores não atenderem aos critérios definidos pela expressão, o SQLite emitirá uma violação de restrição e abortará a instrução.
O
CHECK
restrições permitem que você defina verificações de integridade de dados adicionais além de UNIQUE
ou NOT NULL
para se adequar à sua aplicação específica. SQLite permite que você defina um
CHECK
restrição no nível da coluna ou no nível da tabela. A instrução a seguir mostra como definir um
CHECK
restrição no nível da coluna:CREATE TABLE table_name(
...,
column_name data_type CHECK(expression),
...
);
Code language: SQL (Structured Query Language) (sql)
e a instrução a seguir ilustra como definir um
CHECK
restrição no nível da tabela:CREATE TABLE table_name(
...,
CHECK(expression)
);
Code language: SQL (Structured Query Language) (sql)
Nesta sintaxe, sempre que uma linha é inserida em uma tabela ou uma linha existente é atualizada, a expressão associada a cada
CHECK
A restrição é avaliada e retorna um valor numérico 0 ou 1. Se o resultado for zero, ocorreu uma violação de restrição. Se o resultado for um valor diferente de zero ou NULL, significa que não ocorreu nenhuma violação de restrição.
Observe que a expressão de um
CHECK
restrição não pode conter uma subconsulta. SQLite CHECK
exemplos de restrições
Vejamos alguns exemplos de uso do
CHECK
restrições. 1) Usando SQLite CHECK
restrição no exemplo de nível de coluna
A instrução a seguir cria uma nova tabela chamada
contacts
:CREATE TABLE contacts (
contact_id INTEGER PRIMARY KEY,
first_name TEXT NOT NULL,
last_name TEXT NOT NULL,
email TEXT,
phone TEXT NOT NULL
CHECK (length(phone) >= 10)
);
Code language: SQL (Structured Query Language) (sql)
Nos
contacts
mesa, o phone
coluna tem um CHECK
limitação:CHECK (length(phone) >= 10)
Code language: SQL (Structured Query Language) (sql)
Este
CHECK
A restrição garante que os valores no phone
coluna deve ter pelo menos 10 caracteres. Se você tentar executar a instrução a seguir, receberá um erro de violação de restrição:
INSERT INTO contacts(first_name, last_name, phone)
VALUES('John','Doe','408123456');
Code language: SQL (Structured Query Language) (sql)
Aqui está a mensagem de erro:
Result: CHECK constraint failed: contacts
Code language: SQL (Structured Query Language) (sql)
O motivo foi que o número de telefone que você tentou inserir tem apenas 9 caracteres, enquanto requer pelo menos 10 caracteres.
A instrução a seguir deve funcionar porque o valor no
phone
coluna tem 13 caracteres, o que satisfaz a expressão no CHECK
limitação:INSERT INTO contacts(first_name, last_name, phone)
VALUES('John','Doe','(408)-123-456');
Code language: SQL (Structured Query Language) (sql)
2) Usando SQLite CHECK
restrições no exemplo de nível de tabela
A instrução a seguir cria uma nova tabela chamada
products
:CREATE TABLE products (
product_id INTEGER PRIMARY KEY,
product_name TEXT NOT NULL,
list_price DECIMAL (10, 2) NOT NULL,
discount DECIMAL (10, 2) NOT NULL
DEFAULT 0,
CHECK (list_price >= discount AND
discount >= 0 AND
list_price >= 0)
);
Code language: SQL (Structured Query Language) (sql)
Neste exemplo, o
CHECK
restrição é definida no nível da tabela:CHECK (list_price >= discount AND
discount >= 0 AND
list_price >= 0)
Code language: SQL (Structured Query Language) (sql)
O
CHECK
A restrição garante que o preço de lista seja sempre maior ou igual ao desconto e que o desconto e o preço de lista sejam maiores ou iguais a zero. A instrução a seguir viola o
CHECK
restrição porque o desconto é maior que o preço de lista. INSERT INTO products(product_name, list_price, discount)
VALUES('New Product',900,1000);
Code language: SQL (Structured Query Language) (sql)
A instrução a seguir também viola o
CHECK
restrição porque o desconto é negativo:INSERT INTO products(product_name, list_price, discount)
VALUES('New XFactor',1000,-10);
Code language: SQL (Structured Query Language) (sql)
Adicionando CHECK
restrições para uma tabela existente
A partir da versão 3.25.2, o SQLite não suporta a adição de um
CHECK
restrição a uma tabela existente. No entanto, você pode seguir estas etapas:
Primeiro, crie uma nova tabela cuja estrutura seja a mesma da tabela que você deseja adicionar um
CHECK
limitação. A nova tabela também deve incluir o CHECK
limitação:CREATE TABLE new_table (
[...],
CHECK ([...])
);
Code language: SQL (Structured Query Language) (sql)
Para obter a estrutura da tabela antiga, você pode usar o
.schema
comando. Confira o tutorial da tabela SQLite DESCRIBE para obter mais informações. Em segundo lugar, copie os dados da tabela antiga para a nova tabela.
INSERT INTO new_table SELECT * FROM old_table;
Code language: SQL (Structured Query Language) (sql)
Terceiro, solte a tabela antiga:
DROP TABLE old_table;
Code language: SQL (Structured Query Language) (sql)
Quarto, renomeie a nova tabela para a antiga:
ALTER TABLE new_table RENAME TO old_table;
Code language: SQL (Structured Query Language) (sql)
Para tornar todas as instruções acima de transações seguras, você deve executar todas elas dentro de uma transação como esta:
BEGIN;
-- create a new table
CREATE TABLE new_table (
[...],
CHECK ([...])
);
-- copy data from old table to the new one
INSERT INTO new_table SELECT * FROM old_table;
-- drop the old table
DROP TABLE old_table;
-- rename new table to the old one
ALTER TABLE new_table RENAME TO old_table;
-- commit changes
COMMIT;
Code language: SQL (Structured Query Language) (sql)
Neste tutorial, você aprendeu como usar o SQLite
CHECK
restrição para garantir que os valores em uma coluna ou um grupo de colunas satisfaçam uma condição definida por uma expressão.