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.