Oversigt :i denne vejledning lærer du, hvordan du bruger SQLite CHECK
begrænsning for at validere data før indsættelse eller opdatering.
Introduktion til SQLite CHECK
begrænsninger
SQLite CHECK
begrænsninger giver dig mulighed for at definere udtryk for at teste værdier, når de er indsat i eller opdateret i en kolonne.
Hvis værdierne ikke opfylder kriterierne defineret af udtrykket, vil SQLite udstede en overtrædelse af begrænsningen og afbryde sætningen.
CHECK
begrænsninger giver dig mulighed for at definere yderligere dataintegritetstjek ud over UNIQUE
eller NOT NULL
for at passe til din specifikke applikation.
SQLite giver dig mulighed for at definere en CHECK
begrænsning på kolonneniveau eller tabelniveau.
Følgende sætning viser, hvordan man definerer en CHECK
begrænsning på kolonneniveau:
CREATE TABLE table_name(
...,
column_name data_type CHECK(expression),
...
);
Code language: SQL (Structured Query Language) (sql)
og følgende sætning illustrerer, hvordan man definerer en CHECK
begrænsning på tabelniveau:
CREATE TABLE table_name(
...,
CHECK(expression)
);
Code language: SQL (Structured Query Language) (sql)
I denne syntaks, når en række indsættes i en tabel, eller en eksisterende række opdateres, vil det udtryk, der er knyttet til hver CHECK
begrænsning evalueres og returnerer en numerisk værdi 0 eller 1.
Hvis resultatet er nul, er der sket en overtrædelse af begrænsningen. Hvis resultatet er en værdi, der ikke er nul eller NULL, betyder det, at der ikke er sket en overtrædelse af begrænsningen.
Bemærk, at udtrykket af en CHECK
begrænsning kan ikke indeholde en underforespørgsel.
SQLite CHECK
eksempler på begrænsninger
Lad os tage nogle eksempler på brug af CHECK
begrænsninger.
1) Brug af SQLite CHECK
begrænsning på kolonneniveau eksempel
Følgende sætning opretter en ny tabel med navnet 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)
I contacts
tabellen, phone
kolonne har en CHECK
begrænsning:
CHECK (length(phone) >= 10)
Code language: SQL (Structured Query Language) (sql)
Denne CHECK
begrænsning sikrer, at værdierne i phone
kolonne skal være på mindst 10 tegn.
Hvis du forsøger at udføre følgende sætning, vil du få en begrænsningsfejl:
INSERT INTO contacts(first_name, last_name, phone)
VALUES('John','Doe','408123456');
Code language: SQL (Structured Query Language) (sql)
Her er fejlmeddelelsen:
Result: CHECK constraint failed: contacts
Code language: SQL (Structured Query Language) (sql)
Årsagen var, at det telefonnummer, du forsøgte at indsætte, kun har 9 tegn, mens det kræver mindst 10 tegn.
Følgende sætning burde virke, fordi værdien i phone
kolonne har 13 tegn, som opfylder udtrykket i CHECK
begrænsning:
INSERT INTO contacts(first_name, last_name, phone)
VALUES('John','Doe','(408)-123-456');
Code language: SQL (Structured Query Language) (sql)
2) Brug af SQLite CHECK
begrænsninger på tabelniveaueksemplet
Følgende sætning opretter en ny tabel med navnet 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)
I dette eksempel er CHECK
begrænsning er defineret på tabelniveau:
CHECK (list_price >= discount AND
discount >= 0 AND
list_price >= 0)
Code language: SQL (Structured Query Language) (sql)
CHECK
begrænsning sikrer, at listeprisen altid er større eller lig med rabat, og både rabat og listepris er større eller lig med nul.
Følgende erklæring overtræder CHECK
begrænsning, fordi rabatten er højere end listeprisen.
INSERT INTO products(product_name, list_price, discount)
VALUES('New Product',900,1000);
Code language: SQL (Structured Query Language) (sql)
Følgende erklæring overtræder også CHECK
begrænsning, fordi rabatten er negativ:
INSERT INTO products(product_name, list_price, discount)
VALUES('New XFactor',1000,-10);
Code language: SQL (Structured Query Language) (sql)
Tilføjer CHECK
begrænsninger til en eksisterende tabel
Fra version 3.25.2 understøtter SQLite ikke tilføjelse af en CHECK
begrænsning til en eksisterende tabel.
Du kan dog følge disse trin:
Først skal du oprette en ny tabel, hvis struktur er den samme som den tabel, du vil tilføje en CHECK
begrænsning. Den nye tabel bør også indeholde CHECK
begrænsning:
CREATE TABLE new_table (
[...],
CHECK ([...])
);
Code language: SQL (Structured Query Language) (sql)
For at få strukturen af den gamle tabel, kan du bruge .schema
kommando. Tjek SQLite DESCRIBE-tabellen for mere information.
For det andet skal du kopiere data fra den gamle tabel til den nye tabel.
INSERT INTO new_table SELECT * FROM old_table;
Code language: SQL (Structured Query Language) (sql)
For det tredje, slip den gamle tabel:
DROP TABLE old_table;
Code language: SQL (Structured Query Language) (sql)
For det fjerde, omdøb den nye tabel til den gamle:
ALTER TABLE new_table RENAME TO old_table;
Code language: SQL (Structured Query Language) (sql)
For at gøre alle udsagn ovenfor transaktionssikre, bør du udføre dem alle i en transaktion som denne:
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)
I denne øvelse har du lært, hvordan du bruger SQLite CHECK
begrænsning for at sikre, at værdier i en kolonne eller en gruppe af kolonner opfylder en betingelse defineret af et udtryk.