sql >> Database teknologi >  >> RDS >> SQLite

SQLite CHECK begrænsninger

Oversigt :i denne vejledning lærer du, hvordan du bruger SQLite CHECK begrænsning for at validere data før indsættelse eller opdatering.

Introduktion til SQLite CHECK begrænsninger

SQLite CHECK begrænsninger giver dig mulighed for at definere udtryk for at teste værdier, når de er indsat i eller opdateret i en kolonne.

Hvis værdierne ikke opfylder kriterierne defineret af udtrykket, vil SQLite udstede en overtrædelse af begrænsningen og afbryde sætningen.

CHECK begrænsninger giver dig mulighed for at definere yderligere dataintegritetstjek ud over UNIQUE eller NOT NULL for at passe til din specifikke applikation.

SQLite giver dig mulighed for at definere en CHECK begrænsning på kolonneniveau eller tabelniveau.

Følgende sætning viser, hvordan man definerer en CHECK begrænsning på kolonneniveau:

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

og følgende sætning illustrerer, hvordan man definerer en CHECK begrænsning på tabelniveau:

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

I denne syntaks, når en række indsættes i en tabel, eller en eksisterende række opdateres, vil det udtryk, der er knyttet til hver CHECK begrænsning evalueres og returnerer en numerisk værdi 0 eller 1.

Hvis resultatet er nul, er der sket en overtrædelse af begrænsningen. Hvis resultatet er en værdi, der ikke er nul eller NULL, betyder det, at der ikke er sket en overtrædelse af begrænsningen.

Bemærk, at udtrykket af en CHECK begrænsning kan ikke indeholde en underforespørgsel.

SQLite CHECK eksempler på begrænsninger

Lad os tage nogle eksempler på brug af CHECK begrænsninger.

1) Brug af SQLite CHECK begrænsning på kolonneniveau eksempel

Følgende sætning opretter en ny tabel med navnet 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 kolonne har en CHECK begrænsning:

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

Denne CHECK begrænsning sikrer, at værdierne i phone kolonne skal være på mindst 10 tegn.

Hvis du forsøger at udføre følgende sætning, vil du få en begrænsningsfejl:

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

Her er fejlmeddelelsen:

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

Årsagen var, at det telefonnummer, du forsøgte at indsætte, kun har 9 tegn, mens det kræver mindst 10 tegn.

Følgende sætning burde virke, fordi værdien i phone kolonne har 13 tegn, som opfylder udtrykket 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) Brug af SQLite CHECK begrænsninger på tabelniveaueksemplet

Følgende sætning opretter en ny tabel med navnet 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 dette eksempel er CHECK begrænsning er defineret på tabelniveau:

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

CHECK begrænsning sikrer, at listeprisen altid er større eller lig med rabat, og både rabat og listepris er større eller lig med nul.

Følgende erklæring overtræder CHECK begrænsning, fordi rabatten er højere end listeprisen.

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

Følgende erklæring overtræder også CHECK begrænsning, fordi rabatten er negativ:

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

Tilføjer CHECK begrænsninger til en eksisterende tabel

Fra version 3.25.2 understøtter SQLite ikke tilføjelse af en CHECK begrænsning til en eksisterende tabel.

Du kan dog følge disse trin:

Først skal du oprette en ny tabel, hvis struktur er den samme som den tabel, du vil tilføje en CHECK begrænsning. Den nye tabel bør også indeholde CHECK begrænsning:

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

For at få strukturen af ​​den gamle tabel, kan du bruge .schema kommando. Tjek SQLite DESCRIBE-tabellen for mere information.

For det andet skal du kopiere data fra den gamle tabel til den nye tabel.

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

For det tredje, slip den gamle tabel:

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

For det fjerde, omdøb den nye tabel til den gamle:

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

For at gøre alle udsagn ovenfor transaktionssikre, bør du udføre dem alle i en transaktion som denne:

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 denne øvelse har du lært, hvordan du bruger SQLite CHECK begrænsning for at sikre, at værdier i en kolonne eller en gruppe af kolonner opfylder en betingelse defineret af et udtryk.


  1. Generer datointerval fra to datokolonner

  2. Spring, Hibernate, Blob doven loading

  3. PDO med INSERT INTO gennem udarbejdede erklæringer

  4. Handlingen er ikke gyldig for tilstanden af ​​transaktionsfejlen og transaktionsomfanget