sql >> Databasteknik >  >> RDS >> SQLite

SQLite CHECK-begränsningar

Sammanfattning :i denna handledning kommer du att lära dig hur du använder SQLite CHECK begränsning för att validera data före infogning eller uppdatering.

Introduktion till SQLite CHECK begränsningar

SQLite CHECK begränsningar låter dig definiera uttryck för att testa värden när de infogas i eller uppdateras i en kolumn.

Om värdena inte uppfyller kriterierna som definieras av uttrycket, kommer SQLite att utfärda en begränsningsöverträdelse och avbryta satsen.

CHECK begränsningar tillåter dig att definiera ytterligare dataintegritetskontroller utöver UNIQUE eller NOT NULL för att passa din specifika applikation.

SQLite låter dig definiera en CHECK begränsning på kolumnnivå eller tabellnivå.

Följande sats visar hur man definierar en CHECK begränsning på kolumnnivå:

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

och följande påstående illustrerar hur man definierar en CHECK begränsning på tabellnivå:

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

I denna syntax, närhelst en rad infogas i en tabell eller en befintlig rad uppdateras, kommer uttrycket som är associerat med varje CHECK begränsning utvärderas och returnerar ett numeriskt värde 0 eller 1.

Om resultatet är noll inträffade en begränsningsöverträdelse. Om resultatet är ett värde som inte är noll eller NULL betyder det att ingen överträdelse har inträffat.

Observera att uttrycket för en CHECK begränsning kan inte innehålla en underfråga.

SQLite CHECK exempel på begränsningar

Låt oss ta några exempel på hur du använder CHECK begränsningar.

1) Använda SQLite CHECK begränsning på kolumnnivåexemplet

Följande sats skapar en ny tabell med namnet 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)

I contacts tabellen, phone kolumnen har en CHECK begränsning:

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

Denna CHECK begränsning säkerställer att värdena i phone kolumnen måste bestå av minst 10 tecken.

Om du försöker köra följande sats får du ett begränsningsfel:

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

Här är felmeddelandet:

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

Anledningen var att telefonnumret som du försökte infoga bara har 9 tecken medan det kräver minst 10 tecken.

Följande sats bör fungera eftersom värdet i phone kolumnen har 13 tecken, vilket uppfyller uttrycket i CHECK begränsning:

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

2) Använda SQLite CHECK begränsningar på tabellnivåexemplet

Följande sats skapar en ny tabell med namnet 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)

I det här exemplet visas CHECK begränsning definieras på tabellnivå:

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

CHECK begränsning säkerställer att listpriset alltid är större eller lika med rabatt och att både rabatt och listpris är större eller lika med noll.

Följande uttalande bryter mot CHECK begränsning eftersom rabatten är högre än listpriset.

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

Följande uttalande bryter också mot CHECK begränsning eftersom rabatten är negativ:

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

Lägger till CHECK begränsningar för en befintlig tabell

Från och med version 3.25.2 stöder inte SQLite att lägga till en CHECK begränsning till en befintlig tabell.

Du kan dock följa dessa steg:

Skapa först en ny tabell vars struktur är densamma som den tabell som du vill lägga till en CHECK begränsning. Den nya tabellen bör även innehålla CHECK begränsning:

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

För att få strukturen för den gamla tabellen kan du använda .schema kommando. Kolla in SQLite DESCRIBE-tabellhandledningen för mer information.

För det andra, kopiera data från den gamla tabellen till den nya tabellen.

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

För det tredje, släpp den gamla tabellen:

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

För det fjärde, byt namn på den nya tabellen till den gamla:

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

För att göra alla påståenden ovan transaktionssäkra, bör du utföra dem alla inom en transaktion så här:

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)

I den här handledningen har du lärt dig hur du använder SQLite CHECK begränsning för att säkerställa att värden i en kolumn eller en grupp av kolumner uppfyller ett villkor som definieras av ett uttryck.


  1. Använder merge..output för att få mappning mellan source.id och target.id

  2. NULL komplexitet – del 1

  3. Returnera kolumnvärden före UPPDATERING endast med SQL

  4. Hur man visar sammanställningen av en databas i SQL Server (T-SQL)