SQLite
 sql >> Datenbank >  >> RDS >> SQLite

SQLite CHECK-Einschränkungen

Zusammenfassung :In diesem Tutorial lernen Sie, wie Sie SQLite CHECK verwenden Einschränkung, um Daten vor dem Einfügen oder Aktualisieren zu validieren.

Einführung in SQLite CHECK Einschränkungen

SQLite CHECK Constraints ermöglichen es Ihnen, Ausdrücke zu definieren, um Werte zu testen, wann immer sie in eine Spalte eingefügt oder innerhalb einer Spalte aktualisiert werden.

Wenn die Werte die durch den Ausdruck definierten Kriterien nicht erfüllen, gibt SQLite eine Einschränkungsverletzung aus und bricht die Anweisung ab.

Der CHECK Constraints ermöglichen es Ihnen, zusätzliche Datenintegritätsprüfungen über UNIQUE hinaus zu definieren oder NOT NULL an Ihre spezifische Anwendung anzupassen.

SQLite ermöglicht es Ihnen, einen CHECK zu definieren Einschränkung auf Spaltenebene oder Tabellenebene.

Die folgende Anweisung zeigt, wie ein CHECK definiert wird Einschränkung auf Spaltenebene:

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

und die folgende Anweisung veranschaulicht, wie ein CHECK definiert wird Einschränkung auf Tabellenebene:

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

In dieser Syntax wird jedes Mal, wenn eine Zeile in eine Tabelle eingefügt oder eine vorhandene Zeile aktualisiert wird, der Ausdruck jedem CHECK zugeordnet Einschränkung wird ausgewertet und als numerischer Wert 0 oder 1 zurückgegeben.

Wenn das Ergebnis Null ist, ist eine Beschränkungsverletzung aufgetreten. Wenn das Ergebnis ein Wert ungleich Null oder NULL ist, bedeutet dies, dass keine Einschränkungsverletzung aufgetreten ist.

Beachten Sie, dass der Ausdruck eines CHECK Einschränkung darf keine Unterabfrage enthalten.

SQLite CHECK Beispiele für Einschränkungen

Nehmen wir einige Beispiele für die Verwendung von CHECK Einschränkungen.

1) Mit SQLite CHECK Einschränkung auf Spaltenebene Beispiel

Die folgende Anweisung erstellt eine neue Tabelle namens 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 den contacts Tisch, das phone Spalte hat ein CHECK Einschränkung:

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

Dieses CHECK Constraint stellt sicher, dass die Werte in phone Spalte muss mindestens 10 Zeichen lang sein.

Wenn Sie versuchen, die folgende Anweisung auszuführen, erhalten Sie einen Constraint-Violation-Fehler:

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

Hier ist die Fehlermeldung:

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

Der Grund war, dass die Telefonnummer, die Sie einzufügen versuchten, nur 9 Zeichen hat, während sie mindestens 10 Zeichen erfordert.

Die folgende Anweisung sollte funktionieren, da der Wert in phone Spalte hat 13 Zeichen, was dem Ausdruck in CHECK entspricht Einschränkung:

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

2) Mit SQLite CHECK Einschränkungen auf Tabellenebene Beispiel

Die folgende Anweisung erstellt eine neue Tabelle namens 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 diesem Beispiel der CHECK Einschränkung wird auf Tabellenebene definiert:

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

Der CHECK Einschränkung stellt sicher, dass der Listenpreis immer größer oder gleich dem Rabatt ist und sowohl der Rabatt als auch der Listenpreis größer oder gleich null sind.

Die folgende Anweisung verletzt den CHECK Einschränkung, da der Rabatt höher ist als der Listenpreis.

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

Die folgende Anweisung verletzt auch den CHECK Einschränkung, weil der Rabatt negativ ist:

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

Hinzufügen von CHECK Beschränkungen für eine bestehende Tabelle

Ab Version 3.25.2 unterstützt SQLite das Hinzufügen eines CHECK nicht Beschränkung auf eine vorhandene Tabelle.

Sie können jedoch diesen Schritten folgen:

Erstellen Sie zunächst eine neue Tabelle, deren Struktur dieselbe ist wie die Tabelle, der Sie einen CHECK hinzufügen möchten Zwang. Die neue Tabelle sollte auch den CHECK enthalten Einschränkung:

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

Um die Struktur der alten Tabelle zu erhalten, können Sie das .schema verwenden Befehl. Weitere Informationen finden Sie im SQLite DESCRIBE-Tabellen-Tutorial.

Zweitens kopieren Sie Daten aus der alten Tabelle in die neue Tabelle.

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

Drittens löschen Sie die alte Tabelle:

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

Viertens, benennen Sie die neue Tabelle in die alte um:

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

Um alle obigen Anweisungen transaktionssicher zu machen, sollten Sie sie alle innerhalb einer Transaktion wie dieser ausführen:

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 diesem Tutorial haben Sie gelernt, wie Sie den SQLite CHECK verwenden Einschränkung, um sicherzustellen, dass Werte in einer Spalte oder einer Gruppe von Spalten eine durch einen Ausdruck definierte Bedingung erfüllen.