SQLite
 sql >> база данни >  >> RDS >> SQLite

Ограниченията на SQLite CHECK

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Не може да се предотврати изтичането на обект на SQLiteConnection

  2. Android Room:Как да мигрираме преименуването на колона?

  3. Няма достъп до предварително попълнена база данни на SQLite с помощта на PhoneGap/Cordova в Android

  4. Валидни модификатори за SQLite функции за дата/час

  5. Трябва ли да има един SQLiteOpenHelper за всяка таблица в базата данни?