Sammanfattning :i denna handledning kommer du att lära dig hur du använder SQLite CHECK
begränsning för att validera data före infogning eller uppdatering.
Introduktion till SQLite CHECK
begränsningar
SQLite CHECK
begränsningar låter dig definiera uttryck för att testa värden när de infogas i eller uppdateras i en kolumn.
Om värdena inte uppfyller kriterierna som definieras av uttrycket, kommer SQLite att utfärda en begränsningsöverträdelse och avbryta satsen.
CHECK
begränsningar tillåter dig att definiera ytterligare dataintegritetskontroller utöver UNIQUE
eller NOT NULL
för att passa din specifika applikation.
SQLite låter dig definiera en CHECK
begränsning på kolumnnivå eller tabellnivå.
Följande sats visar hur man definierar en CHECK
begränsning på kolumnnivå:
CREATE TABLE table_name(
...,
column_name data_type CHECK(expression),
...
);
Code language: SQL (Structured Query Language) (sql)
och följande påstående illustrerar hur man definierar en CHECK
begränsning på tabellnivå:
CREATE TABLE table_name(
...,
CHECK(expression)
);
Code language: SQL (Structured Query Language) (sql)
I denna syntax, närhelst en rad infogas i en tabell eller en befintlig rad uppdateras, kommer uttrycket som är associerat med varje CHECK
begränsning utvärderas och returnerar ett numeriskt värde 0 eller 1.
Om resultatet är noll inträffade en begränsningsöverträdelse. Om resultatet är ett värde som inte är noll eller NULL betyder det att ingen överträdelse har inträffat.
Observera att uttrycket för en CHECK
begränsning kan inte innehålla en underfråga.
SQLite CHECK
exempel på begränsningar
Låt oss ta några exempel på hur du använder CHECK
begränsningar.
1) Använda SQLite CHECK
begränsning på kolumnnivåexemplet
Följande sats skapar en ny tabell med namnet 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
kolumnen har en CHECK
begränsning:
CHECK (length(phone) >= 10)
Code language: SQL (Structured Query Language) (sql)
Denna CHECK
begränsning säkerställer att värdena i phone
kolumnen måste bestå av minst 10 tecken.
Om du försöker köra följande sats får du ett begränsningsfel:
INSERT INTO contacts(first_name, last_name, phone)
VALUES('John','Doe','408123456');
Code language: SQL (Structured Query Language) (sql)
Här är felmeddelandet:
Result: CHECK constraint failed: contacts
Code language: SQL (Structured Query Language) (sql)
Anledningen var att telefonnumret som du försökte infoga bara har 9 tecken medan det kräver minst 10 tecken.
Följande sats bör fungera eftersom värdet i phone
kolumnen har 13 tecken, vilket uppfyller uttrycket 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) Använda SQLite CHECK
begränsningar på tabellnivåexemplet
Följande sats skapar en ny tabell med namnet 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 det här exemplet visas CHECK
begränsning definieras på tabellnivå:
CHECK (list_price >= discount AND
discount >= 0 AND
list_price >= 0)
Code language: SQL (Structured Query Language) (sql)
CHECK
begränsning säkerställer att listpriset alltid är större eller lika med rabatt och att både rabatt och listpris är större eller lika med noll.
Följande uttalande bryter mot CHECK
begränsning eftersom rabatten är högre än listpriset.
INSERT INTO products(product_name, list_price, discount)
VALUES('New Product',900,1000);
Code language: SQL (Structured Query Language) (sql)
Följande uttalande bryter också mot CHECK
begränsning eftersom rabatten är negativ:
INSERT INTO products(product_name, list_price, discount)
VALUES('New XFactor',1000,-10);
Code language: SQL (Structured Query Language) (sql)
Lägger till CHECK
begränsningar för en befintlig tabell
Från och med version 3.25.2 stöder inte SQLite att lägga till en CHECK
begränsning till en befintlig tabell.
Du kan dock följa dessa steg:
Skapa först en ny tabell vars struktur är densamma som den tabell som du vill lägga till en CHECK
begränsning. Den nya tabellen bör även innehålla CHECK
begränsning:
CREATE TABLE new_table (
[...],
CHECK ([...])
);
Code language: SQL (Structured Query Language) (sql)
För att få strukturen för den gamla tabellen kan du använda .schema
kommando. Kolla in SQLite DESCRIBE-tabellhandledningen för mer information.
För det andra, kopiera data från den gamla tabellen till den nya tabellen.
INSERT INTO new_table SELECT * FROM old_table;
Code language: SQL (Structured Query Language) (sql)
För det tredje, släpp den gamla tabellen:
DROP TABLE old_table;
Code language: SQL (Structured Query Language) (sql)
För det fjärde, byt namn på den nya tabellen till den gamla:
ALTER TABLE new_table RENAME TO old_table;
Code language: SQL (Structured Query Language) (sql)
För att göra alla påståenden ovan transaktionssäkra, bör du utföra dem alla inom en transaktion så här:
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 den här handledningen har du lärt dig hur du använder SQLite CHECK
begränsning för att säkerställa att värden i en kolumn eller en grupp av kolumner uppfyller ett villkor som definieras av ett uttryck.