Podsumowanie :w tym samouczku dowiesz się, jak używać SQLite CHECK ograniczenie do sprawdzania poprawności danych przed wstawieniem lub aktualizacją.
Wprowadzenie do SQLite CHECK ograniczenia
SQLite CHECK ograniczenia umożliwiają zdefiniowanie wyrażeń do testowania wartości za każdym razem, gdy są one wstawiane lub aktualizowane w kolumnie.
Jeśli wartości nie spełniają kryteriów zdefiniowanych przez wyrażenie, SQLite naruszy ograniczenie i przerwie wykonanie instrukcji.
CHECK ograniczenia pozwalają zdefiniować dodatkowe kontrole integralności danych poza UNIQUE lub NOT NULL pasujące do konkretnego zastosowania.
SQLite pozwala zdefiniować CHECK ograniczenie na poziomie kolumny lub na poziomie tabeli.
Poniższa instrukcja pokazuje, jak zdefiniować CHECK ograniczenie na poziomie kolumny:
CREATE TABLE table_name(
...,
column_name data_type CHECK(expression),
...
);
Code language: SQL (Structured Query Language) (sql)
a następująca instrukcja ilustruje, jak zdefiniować CHECK ograniczenie na poziomie tabeli:
CREATE TABLE table_name(
...,
CHECK(expression)
);
Code language: SQL (Structured Query Language) (sql)
W tej składni za każdym razem, gdy wiersz jest wstawiany do tabeli lub istniejący wiersz jest aktualizowany, wyrażenie powiązane z każdym CHECK ograniczenie jest oceniane i zwracane wartością liczbową 0 lub 1.
Jeśli wynik wynosi zero, wystąpiło naruszenie ograniczenia. Jeśli wynik jest wartością niezerową lub NULL, oznacza to, że nie doszło do naruszenia ograniczenia.
Zauważ, że wyrażenie CHECK ograniczenie nie może zawierać podzapytania.
SQLite CHECK przykłady ograniczeń
Weźmy kilka przykładów użycia CHECK ograniczenia.
1) Korzystanie z SQLite CHECK ograniczenie na przykład na poziomie kolumny
Poniższa instrukcja tworzy nową tabelę o nazwie 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)
W contacts tabeli, phone kolumna ma CHECK ograniczenie:
CHECK (length(phone) >= 10)
Code language: SQL (Structured Query Language) (sql)
To CHECK ograniczenie zapewnia, że wartości w phone kolumna musi mieć co najmniej 10 znaków.
Jeśli spróbujesz wykonać poniższą instrukcję, otrzymasz błąd naruszenia ograniczenia:
INSERT INTO contacts(first_name, last_name, phone)
VALUES('John','Doe','408123456');Code language: SQL (Structured Query Language) (sql) Oto komunikat o błędzie:
Result: CHECK constraint failed: contacts
Code language: SQL (Structured Query Language) (sql) Powodem było to, że numer telefonu, który próbowałeś wstawić, ma tylko 9 znaków, podczas gdy wymaga co najmniej 10 znaków.
Poniższa instrukcja powinna działać, ponieważ wartość w phone kolumna ma 13 znaków, co spełnia wyrażenie w CHECK ograniczenie:
INSERT INTO contacts(first_name, last_name, phone)
VALUES('John','Doe','(408)-123-456');Code language: SQL (Structured Query Language) (sql) 2) Korzystanie z SQLite CHECK ograniczenia na przykład na poziomie tabeli
Poniższa instrukcja tworzy nową tabelę o nazwie 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)
W tym przykładzie CHECK ograniczenie jest zdefiniowane na poziomie tabeli:
CHECK (list_price >= discount AND
discount >= 0 AND
list_price >= 0) Code language: SQL (Structured Query Language) (sql)
CHECK ograniczenie zapewnia, że cena katalogowa jest zawsze większa lub równa rabatowi, a zarówno rabat, jak i cena katalogowa są większe lub równe zeru.
Poniższa instrukcja narusza CHECK ograniczenie, ponieważ rabat jest wyższy niż cena katalogowa.
INSERT INTO products(product_name, list_price, discount)
VALUES('New Product',900,1000); Code language: SQL (Structured Query Language) (sql)
Poniższa instrukcja narusza również CHECK ograniczenie, ponieważ rabat jest ujemny:
INSERT INTO products(product_name, list_price, discount)
VALUES('New XFactor',1000,-10); Code language: SQL (Structured Query Language) (sql) Dodawanie CHECK ograniczenia do istniejącej tabeli
Od wersji 3.25.2 SQLite nie obsługuje dodawania CHECK ograniczenie do istniejącej tabeli.
Możesz jednak wykonać następujące kroki:
Najpierw utwórz nową tabelę, której struktura jest taka sama jak tabela, do której chcesz dodać CHECK ograniczenie. Nowa tabela powinna również zawierać CHECK ograniczenie:
CREATE TABLE new_table (
[...],
CHECK ([...])
);
Code language: SQL (Structured Query Language) (sql)
Aby uzyskać strukturę starej tabeli, możesz użyć .schema Komenda. Sprawdź samouczek tabeli SQLite DESCRIBE, aby uzyskać więcej informacji.
Po drugie, skopiuj dane ze starej tabeli do nowej.
INSERT INTO new_table SELECT * FROM old_table;Code language: SQL (Structured Query Language) (sql) Po trzecie, upuść starą tabelę:
DROP TABLE old_table;Code language: SQL (Structured Query Language) (sql) Po czwarte, zmień nazwę nowej tabeli na starą:
ALTER TABLE new_table RENAME TO old_table;Code language: SQL (Structured Query Language) (sql) Aby wszystkie powyższe oświadczenia były bezpieczne dla transakcji, powinieneś wykonać je wszystkie w ramach transakcji w następujący sposób:
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)
W tym samouczku nauczyłeś się korzystać z SQLite CHECK ograniczenie zapewniające, że wartości w kolumnie lub grupie kolumn spełniają warunek zdefiniowany przez wyrażenie.