Резюме :в този урок ще научите как да използвате SQLite CHECK ограничение за валидиране на данни преди вмъкване или актуализиране.
Въведение в SQLite CHECK ограничения
SQLite CHECK ограниченията ви позволяват да дефинирате изрази за тестване на стойности всеки път, когато се вмъкват или актуализират в колона.
Ако стойностите не отговарят на критериите, дефинирани от израза, SQLite ще издаде нарушение на ограничението и ще прекрати изявлението.
CHECK ограниченията ви позволяват да дефинирате допълнителни проверки за целостта на данните извън UNIQUE или NOT NULL за да отговарят на вашето конкретно приложение.
SQLite ви позволява да дефинирате CHECK ограничение на ниво колона или ниво таблица.
Следното изявление показва как да дефинирате CHECK ограничение на ниво колона:
CREATE TABLE table_name(
...,
column_name data_type CHECK(expression),
...
);
Code language: SQL (Structured Query Language) (sql)
и следното изявление илюстрира как да дефинирате CHECK ограничение на ниво таблица:
CREATE TABLE table_name(
...,
CHECK(expression)
);
Code language: SQL (Structured Query Language) (sql)
В този синтаксис всеки път, когато се вмъкне ред в таблица или се актуализира съществуващ ред, изразът, свързан с всеки CHECK ограничението се оценява и връща числова стойност 0 или 1.
Ако резултатът е нула, тогава е възникнало нарушение на ограничението. Ако резултатът е ненулева стойност или NULL, това означава, че не е възникнало нарушение на ограничението.
Имайте предвид, че изразът на CHECK ограничението не може да съдържа подзаявка.
SQLite CHECK примери за ограничения
Нека вземем няколко примера за използване на CHECK ограничения.
1) Използване на SQLite CHECK пример за ограничение на ниво колона
Следното изявление създава нова таблица с име 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)
В contacts таблицата, phone колоната има CHECK ограничение:
CHECK (length(phone) >= 10)
Code language: SQL (Structured Query Language) (sql)
Тази CHECK ограничението гарантира, че стойностите в phone колоната трябва да съдържа най-малко 10 знака.
Ако се опитате да изпълните следния оператор, ще получите грешка при нарушение на ограничението:
INSERT INTO contacts(first_name, last_name, phone)
VALUES('John','Doe','408123456');Code language: SQL (Structured Query Language) (sql) Ето съобщението за грешка:
Result: CHECK constraint failed: contacts
Code language: SQL (Structured Query Language) (sql) Причината беше, че телефонният номер, който се опитахте да вмъкнете, има само 9 знака, докато изисква поне 10 знака.
Следното изявление трябва да работи, защото стойността в phone колоната има 13 знака, което удовлетворява израза в CHECK ограничение:
INSERT INTO contacts(first_name, last_name, phone)
VALUES('John','Doe','(408)-123-456');Code language: SQL (Structured Query Language) (sql) 2) Използване на SQLite CHECK пример за ограничения на ниво таблица
Следното изявление създава нова таблица с име 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)
В този пример CHECK ограничението се дефинира на ниво таблица:
CHECK (list_price >= discount AND
discount >= 0 AND
list_price >= 0) Code language: SQL (Structured Query Language) (sql)
CHECK ограничението гарантира, че каталожната цена винаги е по-голяма или равна на отстъпката и както отстъпката, така и каталожната цена са по-големи или равни на нула.
Следното изявление нарушава CHECK ограничение, тъй като отстъпката е по-висока от каталожната цена.
INSERT INTO products(product_name, list_price, discount)
VALUES('New Product',900,1000); Code language: SQL (Structured Query Language) (sql)
Следното твърдение също нарушава CHECK ограничение, тъй като отстъпката е отрицателна:
INSERT INTO products(product_name, list_price, discount)
VALUES('New XFactor',1000,-10); Code language: SQL (Structured Query Language) (sql) Добавяне на CHECK ограничения за съществуваща таблица
От версия 3.25.2 SQLite не поддържа добавяне на CHECK ограничение към съществуваща таблица.
Можете обаче да следвате тези стъпки:
Първо създайте нова таблица, чиято структура е същата като таблицата, към която искате да добавите CHECK ограничение. Новата таблица трябва също да включва CHECK ограничение:
CREATE TABLE new_table (
[...],
CHECK ([...])
);
Code language: SQL (Structured Query Language) (sql)
За да получите структурата на старата таблица, можете да използвате .schema команда. Вижте урока за таблицата SQLite DESCRIBE за повече информация.
Второ, копирайте данните от старата таблица в новата таблица.
INSERT INTO new_table SELECT * FROM old_table;Code language: SQL (Structured Query Language) (sql) Трето, махнете старата таблица:
DROP TABLE old_table;Code language: SQL (Structured Query Language) (sql) Четвърто, преименувайте новата таблица на старата:
ALTER TABLE new_table RENAME TO old_table;Code language: SQL (Structured Query Language) (sql) За да направите всички оператори по-горе безопасни за транзакции, трябва да ги изпълните в рамките на транзакция като тази:
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)
В този урок научихте как да използвате SQLite CHECK ограничение, за да се гарантира, че стойностите в колона или група от колони удовлетворяват условие, дефинирано от израз.