Резюме :в този урок ще научите как да използвате 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
ограничение, за да се гарантира, че стойностите в колона или група от колони удовлетворяват условие, дефинирано от израз.