SQLite
 sql >> Database >  >> RDS >> SQLite

SQLite CHECK vincoli

Riepilogo :in questo tutorial imparerai come usare SQLite CHECK vincolo di convalida dei dati prima dell'inserimento o dell'aggiornamento.

Introduzione a SQLite CHECK vincoli

SQLite CHECK i vincoli consentono di definire espressioni per testare i valori ogni volta che vengono inseriti o aggiornati all'interno di una colonna.

Se i valori non soddisfano i criteri definiti dall'espressione, SQLite emetterà una violazione del vincolo e interromperà l'istruzione.

Il CHECK i vincoli consentono di definire ulteriori controlli di integrità dei dati oltre a UNIQUE o NOT NULL per soddisfare la tua specifica applicazione.

SQLite ti permette di definire un CHECK vincolo a livello di colonna o di tabella.

La seguente istruzione mostra come definire un CHECK vincolo a livello di colonna:

CREATE TABLE table_name(
    ...,
    column_name data_type CHECK(expression),
    ...
);
Code language: SQL (Structured Query Language) (sql)

e la seguente istruzione illustra come definire un CHECK vincolo a livello di tabella:

CREATE TABLE table_name(
    ...,
    CHECK(expression)
);
Code language: SQL (Structured Query Language) (sql)

In questa sintassi, ogni volta che viene inserita una riga in una tabella o viene aggiornata una riga esistente, l'espressione associata a ciascun CHECK il vincolo viene valutato e restituito un valore numerico 0 o 1.

Se il risultato è zero, si è verificata una violazione del vincolo. Se il risultato è un valore diverso da zero o NULL, significa che non si è verificata alcuna violazione del vincolo.

Nota che l'espressione di un CHECK il vincolo non può contenere una sottoquery.

SQLite CHECK esempi di vincoli

Facciamo alcuni esempi di utilizzo di CHECK vincoli.

1) Utilizzo di SQLite CHECK vincolo a livello di colonna esempio

La seguente istruzione crea una nuova tabella denominata 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)

Nei contacts tabella, il phone la colonna ha un CHECK vincolo:

CHECK (length(phone) >= 10) 
Code language: SQL (Structured Query Language) (sql)

Questo CHECK vincolo garantisce che i valori nel phone la colonna deve contenere almeno 10 caratteri.

Se tenti di eseguire la seguente istruzione, riceverai un errore di violazione del vincolo:

INSERT INTO contacts(first_name, last_name, phone)
VALUES('John','Doe','408123456');Code language: SQL (Structured Query Language) (sql)

Ecco il messaggio di errore:

Result: CHECK constraint failed: contacts
Code language: SQL (Structured Query Language) (sql)

Il motivo è che il numero di telefono che hai tentato di inserire ha solo 9 caratteri mentre richiede almeno 10 caratteri.

La seguente istruzione dovrebbe funzionare perché il valore nel phone la colonna ha 13 caratteri, che soddisfa l'espressione nel CHECK vincolo:

INSERT INTO contacts(first_name, last_name, phone)
VALUES('John','Doe','(408)-123-456');Code language: SQL (Structured Query Language) (sql)

2) Utilizzo di SQLite CHECK vincoli a livello di tabella esempio

La seguente istruzione crea una nuova tabella denominata 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)

In questo esempio, il CHECK il vincolo è definito a livello di tabella:

CHECK (list_price >= discount AND 
            discount >= 0 AND 
            list_price >= 0) Code language: SQL (Structured Query Language) (sql)

Il CHECK vincolo garantisce che il prezzo di listino sia sempre maggiore o uguale allo sconto e che sia lo sconto che il prezzo di listino siano maggiori o uguali a zero.

La seguente istruzione viola il CHECK vincolo perché lo sconto è superiore al prezzo di listino.

INSERT INTO products(product_name, list_price, discount)
VALUES('New Product',900,1000);    Code language: SQL (Structured Query Language) (sql)

Anche la seguente istruzione viola il CHECK vincolo perché lo sconto è negativo:

INSERT INTO products(product_name, list_price, discount)
VALUES('New XFactor',1000,-10);    Code language: SQL (Structured Query Language) (sql)

Aggiunta di CHECK vincoli a una tabella esistente

A partire dalla versione 3.25.2, SQLite non supporta l'aggiunta di un CHECK vincolo a una tabella esistente.

Tuttavia, puoi seguire questi passaggi:

Per prima cosa, crea una nuova tabella la cui struttura è la stessa della tabella a cui vuoi aggiungere un CHECK vincolo. La nuova tabella dovrebbe includere anche il CHECK vincolo:

CREATE TABLE new_table (
    [...],
    CHECK ([...])
);
Code language: SQL (Structured Query Language) (sql)

Per ottenere la struttura della vecchia tabella, puoi utilizzare il .schema comando. Consulta il tutorial sulla tabella SQLite DESCRIBE per ulteriori informazioni.

In secondo luogo, copia i dati dalla vecchia tabella alla nuova tabella.

INSERT INTO new_table SELECT * FROM old_table;Code language: SQL (Structured Query Language) (sql)

Terzo, elimina la vecchia tabella:

DROP TABLE old_table;Code language: SQL (Structured Query Language) (sql)

In quarto luogo, rinomina la nuova tabella con quella precedente:

ALTER TABLE new_table RENAME TO old_table;Code language: SQL (Structured Query Language) (sql)

Per rendere sicure tutte le affermazioni di cui sopra, dovresti eseguirle tutte all'interno di una transazione come questa:

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)

In questo tutorial, hai imparato come usare SQLite CHECK vincolo per garantire che i valori in una colonna o in un gruppo di colonne soddisfino una condizione definita da un'espressione.