Shrnutí :v tomto tutoriálu se naučíte používat SQLite CHECK
omezení pro ověření dat před vložením nebo aktualizací.
Úvod do SQLite CHECK
omezení
SQLite CHECK
omezení umožňují definovat výrazy pro testování hodnot, kdykoli jsou vloženy do sloupce nebo v něm aktualizovány.
Pokud hodnoty nesplňují kritéria definovaná výrazem, SQLite vydá porušení omezení a zruší příkaz.
CHECK
omezení umožňují definovat další kontroly integrity dat nad rámec UNIQUE
nebo NOT NULL
aby vyhovovaly vaší konkrétní aplikaci.
SQLite umožňuje definovat CHECK
omezení na úrovni sloupců nebo tabulky.
Následující příkaz ukazuje, jak definovat CHECK
omezení na úrovni sloupce:
CREATE TABLE table_name(
...,
column_name data_type CHECK(expression),
...
);
Code language: SQL (Structured Query Language) (sql)
a následující příkaz ilustruje, jak definovat CHECK
omezení na úrovni tabulky:
CREATE TABLE table_name(
...,
CHECK(expression)
);
Code language: SQL (Structured Query Language) (sql)
V této syntaxi, kdykoli je do tabulky vložen řádek nebo je aktualizován existující řádek, výraz spojený s každým CHECK
omezení se vyhodnotí a vrátí číselnou hodnotu 0 nebo 1.
Pokud je výsledek nula, došlo k porušení omezení. Pokud je výsledkem nenulová hodnota nebo NULL, znamená to, že nedošlo k porušení omezení.
Všimněte si, že výraz CHECK
omezení nemůže obsahovat poddotaz.
SQLite CHECK
příklady omezení
Podívejme se na několik příkladů použití CHECK
omezení.
1) Pomocí SQLite CHECK
omezení na příkladu na úrovni sloupců
Následující příkaz vytvoří novou tabulku s názvem 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)
V contacts
tabulka, phone
sloupec má CHECK
omezení:
CHECK (length(phone) >= 10)
Code language: SQL (Structured Query Language) (sql)
Tato CHECK
omezení zajišťuje, že hodnoty v phone
sloupec musí mít alespoň 10 znaků.
Pokud se pokusíte provést následující příkaz, zobrazí se chyba porušení omezení:
INSERT INTO contacts(first_name, last_name, phone)
VALUES('John','Doe','408123456');
Code language: SQL (Structured Query Language) (sql)
Zde je chybová zpráva:
Result: CHECK constraint failed: contacts
Code language: SQL (Structured Query Language) (sql)
Důvodem bylo, že telefonní číslo, které jste se pokusili vložit, má pouze 9 znaků, zatímco vyžaduje alespoň 10 znaků.
Následující příkaz by měl fungovat, protože hodnota v phone
sloupec má 13 znaků, což odpovídá výrazu v CHECK
omezení:
INSERT INTO contacts(first_name, last_name, phone)
VALUES('John','Doe','(408)-123-456');
Code language: SQL (Structured Query Language) (sql)
2) Pomocí SQLite CHECK
omezení na příkladu na úrovni tabulky
Následující příkaz vytvoří novou tabulku s názvem 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)
V tomto příkladu CHECK
omezení je definováno na úrovni tabulky:
CHECK (list_price >= discount AND
discount >= 0 AND
list_price >= 0)
Code language: SQL (Structured Query Language) (sql)
CHECK
omezení zajišťuje, že katalogová cena je vždy větší nebo rovna slevě a jak sleva, tak katalogová cena jsou větší nebo rovné nule.
Následující prohlášení porušuje CHECK
omezení, protože sleva je vyšší než katalogová cena.
INSERT INTO products(product_name, list_price, discount)
VALUES('New Product',900,1000);
Code language: SQL (Structured Query Language) (sql)
Následující prohlášení také porušuje CHECK
omezení, protože sleva je záporná:
INSERT INTO products(product_name, list_price, discount)
VALUES('New XFactor',1000,-10);
Code language: SQL (Structured Query Language) (sql)
Přidání CHECK
omezení na existující tabulku
Od verze 3.25.2 SQLite nepodporuje přidání CHECK
omezení na existující tabulku.
Můžete však postupovat takto:
Nejprve vytvořte novou tabulku, jejíž struktura je stejná jako u tabulky, ke které chcete přidat CHECK
omezení. Nová tabulka by také měla obsahovat CHECK
omezení:
CREATE TABLE new_table (
[...],
CHECK ([...])
);
Code language: SQL (Structured Query Language) (sql)
Chcete-li získat strukturu staré tabulky, můžete použít .schema
příkaz. Podívejte se na výukový program tabulky SQLite DESCRIBE pro více informací.
Za druhé, zkopírujte data ze staré tabulky do nové tabulky.
INSERT INTO new_table SELECT * FROM old_table;
Code language: SQL (Structured Query Language) (sql)
Za třetí, zrušte starou tabulku:
DROP TABLE old_table;
Code language: SQL (Structured Query Language) (sql)
Za čtvrté, přejmenujte novou tabulku na starou:
ALTER TABLE new_table RENAME TO old_table;
Code language: SQL (Structured Query Language) (sql)
Aby byly všechny výše uvedené příkazy bezpečné pro transakce, měli byste je všechny provést v rámci transakce, jako je tato:
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)
V tomto tutoriálu jste se naučili používat SQLite CHECK
omezení, které zajistí, že hodnoty ve sloupci nebo skupině sloupců splňují podmínku definovanou výrazem.