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.