SQLite
 sql >> Base de Dados >  >> RDS >> SQLite

Restrições SQLite CHECK


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.