sql >> Database >  >> RDS >> SQLite

SQLite CHECK-beperkingen

Samenvatting :in deze tutorial leer je hoe je SQLite CHECK . gebruikt beperking om gegevens te valideren voordat ze worden ingevoegd of bijgewerkt.

Inleiding tot SQLite CHECK beperkingen

SQLite CHECK Met beperkingen kunt u expressies definiëren om waarden te testen wanneer ze worden ingevoegd in of bijgewerkt in een kolom.

Als de waarden niet voldoen aan de criteria gedefinieerd door de expressie, zal SQLite een beperkingsschending afgeven en de instructie afbreken.

De CHECK beperkingen stellen u in staat aanvullende gegevensintegriteitscontroles te definiëren die verder gaan dan UNIQUE of NOT NULL voor uw specifieke toepassing.

Met SQLite kunt u een CHECK . definiëren beperking op kolom- of tabelniveau.

De volgende instructie laat zien hoe u een CHECK . definieert beperking op kolomniveau:

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

en de volgende verklaring illustreert hoe u een CHECK . definieert beperking op tafelniveau:

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

Wanneer in deze syntaxis een rij wordt ingevoegd in een tabel of een bestaande rij wordt bijgewerkt, wordt de uitdrukking die is gekoppeld aan elke CHECK beperking wordt geëvalueerd en retourneert een numerieke waarde 0 of 1.

Als het resultaat nul is, is er een beperkingsschending opgetreden. Als het resultaat een waarde is die niet nul is of NULL, betekent dit dat er geen schending van de beperking heeft plaatsgevonden.

Merk op dat de uitdrukking van een CHECK beperking kan geen subquery bevatten.

SQLite CHECK voorbeelden van beperkingen

Laten we enkele voorbeelden nemen van het gebruik van de CHECK beperkingen.

1) SQLite gebruiken CHECK beperking op kolomniveau voorbeeld

De volgende instructie maakt een nieuwe tabel aan met de naam 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)

In de contacts tafel, de phone kolom heeft een CHECK beperking:

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

Deze CHECK beperking zorgt ervoor dat de waarden in de phone kolom moet minimaal 10 tekens lang zijn.

Als u de volgende instructie probeert uit te voeren, krijgt u een foutmelding over het overtreden van een beperking:

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

Hier is de foutmelding:

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

De reden was dat het telefoonnummer dat u probeerde in te voeren slechts 9 tekens heeft, terwijl het minstens 10 tekens vereist.

De volgende instructie zou moeten werken omdat de waarde in de phone kolom heeft 13 tekens, wat voldoet aan de uitdrukking in de CHECK beperking:

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

2) SQLite gebruiken CHECK beperkingen op tabelniveau voorbeeld

De volgende instructie maakt een nieuwe tabel aan met de naam 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)

In dit voorbeeld is de CHECK beperking wordt gedefinieerd op tabelniveau:

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

De CHECK beperking zorgt ervoor dat de catalogusprijs altijd groter of gelijk is aan de korting en dat zowel de korting als de catalogusprijs groter of gelijk aan nul zijn.

De volgende verklaring is in strijd met de CHECK beperking omdat de korting hoger is dan de catalogusprijs.

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

De volgende verklaring is ook in strijd met de CHECK beperking omdat de korting negatief is:

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

CHECK toevoegen beperkingen voor een bestaande tabel

Vanaf versie 3.25.2 biedt SQLite geen ondersteuning voor het toevoegen van een CHECK beperking tot een bestaande tabel.

U kunt echter deze stappen volgen:

Maak eerst een nieuwe tabel waarvan de structuur hetzelfde is als de tabel waaraan u een CHECK wilt toevoegen beperking. De nieuwe tabel moet ook de CHECK . bevatten beperking:

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

Om de structuur van de oude tabel te krijgen, kunt u de .schema . gebruiken opdracht. Bekijk de SQLite DESCRIBE tabel tutorial voor meer informatie.

Ten tweede, kopieer gegevens van de oude tabel naar de nieuwe tabel.

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

Ten derde, laat de oude tabel vallen:

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

Ten vierde, hernoem de nieuwe tabel naar de oude:

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

Om alle bovenstaande verklaringen transactieveilig te maken, moet u ze allemaal uitvoeren binnen een transactie zoals deze:

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)

In deze tutorial heb je geleerd hoe je de SQLite CHECK . gebruikt beperking om ervoor te zorgen dat waarden in een kolom of een groep kolommen voldoen aan een voorwaarde die is gedefinieerd door een uitdrukking.


  1. De ADO.NET-provider 'Oracle.ManagedDataAccess.Client' is niet geregistreerd in het configuratiebestand van de machine of de toepassing, of kan niet worden geladen

  2. Spotlight Cloud-alarmen aanpassen

  3. Genereer een set of sequentie zonder lussen – deel 1

  4. REGEXP_REPLACE() Functie in Oracle