Samenvatting :in deze tutorial leer je hoe je SQLite CHECK
. gebruikt beperking om gegevens te valideren voordat ze worden ingevoegd of bijgewerkt.
Inleiding tot SQLite CHECK
beperkingen
SQLite CHECK
Met beperkingen kunt u expressies definiëren om waarden te testen wanneer ze worden ingevoegd in of bijgewerkt in een kolom.
Als de waarden niet voldoen aan de criteria gedefinieerd door de expressie, zal SQLite een beperkingsschending afgeven en de instructie afbreken.
De CHECK
beperkingen stellen u in staat aanvullende gegevensintegriteitscontroles te definiëren die verder gaan dan UNIQUE
of NOT NULL
voor uw specifieke toepassing.
Met SQLite kunt u een CHECK
. definiëren beperking op kolom- of tabelniveau.
De volgende instructie laat zien hoe u een CHECK
. definieert beperking op kolomniveau:
CREATE TABLE table_name(
...,
column_name data_type CHECK(expression),
...
);
Code language: SQL (Structured Query Language) (sql)
en de volgende verklaring illustreert hoe u een CHECK
. definieert beperking op tafelniveau:
CREATE TABLE table_name(
...,
CHECK(expression)
);
Code language: SQL (Structured Query Language) (sql)
Wanneer in deze syntaxis een rij wordt ingevoegd in een tabel of een bestaande rij wordt bijgewerkt, wordt de uitdrukking die is gekoppeld aan elke CHECK
beperking wordt geëvalueerd en retourneert een numerieke waarde 0 of 1.
Als het resultaat nul is, is er een beperkingsschending opgetreden. Als het resultaat een waarde is die niet nul is of NULL, betekent dit dat er geen schending van de beperking heeft plaatsgevonden.
Merk op dat de uitdrukking van een CHECK
beperking kan geen subquery bevatten.
SQLite CHECK
voorbeelden van beperkingen
Laten we enkele voorbeelden nemen van het gebruik van de CHECK
beperkingen.
1) SQLite gebruiken CHECK
beperking op kolomniveau voorbeeld
De volgende instructie maakt een nieuwe tabel aan met de naam 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)
In de contacts
tafel, de phone
kolom heeft een CHECK
beperking:
CHECK (length(phone) >= 10)
Code language: SQL (Structured Query Language) (sql)
Deze CHECK
beperking zorgt ervoor dat de waarden in de phone
kolom moet minimaal 10 tekens lang zijn.
Als u de volgende instructie probeert uit te voeren, krijgt u een foutmelding over het overtreden van een beperking:
INSERT INTO contacts(first_name, last_name, phone)
VALUES('John','Doe','408123456');
Code language: SQL (Structured Query Language) (sql)
Hier is de foutmelding:
Result: CHECK constraint failed: contacts
Code language: SQL (Structured Query Language) (sql)
De reden was dat het telefoonnummer dat u probeerde in te voeren slechts 9 tekens heeft, terwijl het minstens 10 tekens vereist.
De volgende instructie zou moeten werken omdat de waarde in de phone
kolom heeft 13 tekens, wat voldoet aan de uitdrukking in de CHECK
beperking:
INSERT INTO contacts(first_name, last_name, phone)
VALUES('John','Doe','(408)-123-456');
Code language: SQL (Structured Query Language) (sql)
2) SQLite gebruiken CHECK
beperkingen op tabelniveau voorbeeld
De volgende instructie maakt een nieuwe tabel aan met de naam 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 dit voorbeeld is de CHECK
beperking wordt gedefinieerd op tabelniveau:
CHECK (list_price >= discount AND
discount >= 0 AND
list_price >= 0)
Code language: SQL (Structured Query Language) (sql)
De CHECK
beperking zorgt ervoor dat de catalogusprijs altijd groter of gelijk is aan de korting en dat zowel de korting als de catalogusprijs groter of gelijk aan nul zijn.
De volgende verklaring is in strijd met de CHECK
beperking omdat de korting hoger is dan de catalogusprijs.
INSERT INTO products(product_name, list_price, discount)
VALUES('New Product',900,1000);
Code language: SQL (Structured Query Language) (sql)
De volgende verklaring is ook in strijd met de CHECK
beperking omdat de korting negatief is:
INSERT INTO products(product_name, list_price, discount)
VALUES('New XFactor',1000,-10);
Code language: SQL (Structured Query Language) (sql)
CHECK
toevoegen beperkingen voor een bestaande tabel
Vanaf versie 3.25.2 biedt SQLite geen ondersteuning voor het toevoegen van een CHECK
beperking tot een bestaande tabel.
U kunt echter deze stappen volgen:
Maak eerst een nieuwe tabel waarvan de structuur hetzelfde is als de tabel waaraan u een CHECK
wilt toevoegen beperking. De nieuwe tabel moet ook de CHECK
. bevatten beperking:
CREATE TABLE new_table (
[...],
CHECK ([...])
);
Code language: SQL (Structured Query Language) (sql)
Om de structuur van de oude tabel te krijgen, kunt u de .schema
. gebruiken opdracht. Bekijk de SQLite DESCRIBE tabel tutorial voor meer informatie.
Ten tweede, kopieer gegevens van de oude tabel naar de nieuwe tabel.
INSERT INTO new_table SELECT * FROM old_table;
Code language: SQL (Structured Query Language) (sql)
Ten derde, laat de oude tabel vallen:
DROP TABLE old_table;
Code language: SQL (Structured Query Language) (sql)
Ten vierde, hernoem de nieuwe tabel naar de oude:
ALTER TABLE new_table RENAME TO old_table;
Code language: SQL (Structured Query Language) (sql)
Om alle bovenstaande verklaringen transactieveilig te maken, moet u ze allemaal uitvoeren binnen een transactie zoals deze:
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 deze tutorial heb je geleerd hoe je de SQLite CHECK
. gebruikt beperking om ervoor te zorgen dat waarden in een kolom of een groep kolommen voldoen aan een voorwaarde die is gedefinieerd door een uitdrukking.