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.