sql >> Databáze >  >> RDS >> SQLite

SQLite CHECK omezení

Shrnutí :v tomto tutoriálu se naučíte používat SQLite CHECK omezení pro ověření dat před vložením nebo aktualizací.

Úvod do SQLite CHECK omezení

SQLite CHECK omezení umožňují definovat výrazy pro testování hodnot, kdykoli jsou vloženy do sloupce nebo v něm aktualizovány.

Pokud hodnoty nesplňují kritéria definovaná výrazem, SQLite vydá porušení omezení a zruší příkaz.

CHECK omezení umožňují definovat další kontroly integrity dat nad rámec UNIQUE nebo NOT NULL aby vyhovovaly vaší konkrétní aplikaci.

SQLite umožňuje definovat CHECK omezení na úrovni sloupců nebo tabulky.

Následující příkaz ukazuje, jak definovat CHECK omezení na úrovni sloupce:

CREATE TABLE table_name(
    ...,
    column_name data_type CHECK(expression),
    ...
);
Code language: SQL (Structured Query Language) (sql)

a následující příkaz ilustruje, jak definovat CHECK omezení na úrovni tabulky:

CREATE TABLE table_name(
    ...,
    CHECK(expression)
);
Code language: SQL (Structured Query Language) (sql)

V této syntaxi, kdykoli je do tabulky vložen řádek nebo je aktualizován existující řádek, výraz spojený s každým CHECK omezení se vyhodnotí a vrátí číselnou hodnotu 0 nebo 1.

Pokud je výsledek nula, došlo k porušení omezení. Pokud je výsledkem nenulová hodnota nebo NULL, znamená to, že nedošlo k porušení omezení.

Všimněte si, že výraz CHECK omezení nemůže obsahovat poddotaz.

SQLite CHECK příklady omezení

Podívejme se na několik příkladů použití CHECK omezení.

1) Pomocí SQLite CHECK omezení na příkladu na úrovni sloupců

Následující příkaz vytvoří novou tabulku s názvem 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)

V contacts tabulka, phone sloupec má CHECK omezení:

CHECK (length(phone) >= 10) 
Code language: SQL (Structured Query Language) (sql)

Tato CHECK omezení zajišťuje, že hodnoty v phone sloupec musí mít alespoň 10 znaků.

Pokud se pokusíte provést následující příkaz, zobrazí se chyba porušení omezení:

INSERT INTO contacts(first_name, last_name, phone)
VALUES('John','Doe','408123456');Code language: SQL (Structured Query Language) (sql)

Zde je chybová zpráva:

Result: CHECK constraint failed: contacts
Code language: SQL (Structured Query Language) (sql)

Důvodem bylo, že telefonní číslo, které jste se pokusili vložit, má pouze 9 znaků, zatímco vyžaduje alespoň 10 znaků.

Následující příkaz by měl fungovat, protože hodnota v phone sloupec má 13 znaků, což odpovídá výrazu v CHECK omezení:

INSERT INTO contacts(first_name, last_name, phone)
VALUES('John','Doe','(408)-123-456');Code language: SQL (Structured Query Language) (sql)

2) Pomocí SQLite CHECK omezení na příkladu na úrovni tabulky

Následující příkaz vytvoří novou tabulku s názvem 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)

V tomto příkladu CHECK omezení je definováno na úrovni tabulky:

CHECK (list_price >= discount AND 
            discount >= 0 AND 
            list_price >= 0) Code language: SQL (Structured Query Language) (sql)

CHECK omezení zajišťuje, že katalogová cena je vždy větší nebo rovna slevě a jak sleva, tak katalogová cena jsou větší nebo rovné nule.

Následující prohlášení porušuje CHECK omezení, protože sleva je vyšší než katalogová cena.

INSERT INTO products(product_name, list_price, discount)
VALUES('New Product',900,1000);    Code language: SQL (Structured Query Language) (sql)

Následující prohlášení také porušuje CHECK omezení, protože sleva je záporná:

INSERT INTO products(product_name, list_price, discount)
VALUES('New XFactor',1000,-10);    Code language: SQL (Structured Query Language) (sql)

Přidání CHECK omezení na existující tabulku

Od verze 3.25.2 SQLite nepodporuje přidání CHECK omezení na existující tabulku.

Můžete však postupovat takto:

Nejprve vytvořte novou tabulku, jejíž struktura je stejná jako u tabulky, ke které chcete přidat CHECK omezení. Nová tabulka by také měla obsahovat CHECK omezení:

CREATE TABLE new_table (
    [...],
    CHECK ([...])
);
Code language: SQL (Structured Query Language) (sql)

Chcete-li získat strukturu staré tabulky, můžete použít .schema příkaz. Podívejte se na výukový program tabulky SQLite DESCRIBE pro více informací.

Za druhé, zkopírujte data ze staré tabulky do nové tabulky.

INSERT INTO new_table SELECT * FROM old_table;Code language: SQL (Structured Query Language) (sql)

Za třetí, zrušte starou tabulku:

DROP TABLE old_table;Code language: SQL (Structured Query Language) (sql)

Za čtvrté, přejmenujte novou tabulku na starou:

ALTER TABLE new_table RENAME TO old_table;Code language: SQL (Structured Query Language) (sql)

Aby byly všechny výše uvedené příkazy bezpečné pro transakce, měli byste je všechny provést v rámci transakce, jako je tato:

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)

V tomto tutoriálu jste se naučili používat SQLite CHECK omezení, které zajistí, že hodnoty ve sloupci nebo skupině sloupců splňují podmínku definovanou výrazem.


  1. Použijte proměnnou s TOP v příkazu select na serveru SQL Server, aniž by byla dynamická

  2. 4 Úžasné zdroje monitorování SQL Serveru pro správce databází

  3. Zkopírujte tabulku z jedné databáze do druhé v Postgresu

  4. Řetězce vlastního číselného formátu podporované FORMAT() na serveru SQL Server