SQLite
 sql >> Baza danych >  >> RDS >> SQLite

Ograniczenia SQLite CHECK

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wyślij aplikację z bazą danych

  2. SQLite JSON_PATCH()

  3. ODKURZACZ SQLite

  4. Nie można otworzyć bazy danych w trybie odczytu/zapisu

  5. Jak pobrać dane z bazy danych i wyświetlić je jako ListView?