Zusammenfassung :In diesem Tutorial lernen Sie SQLite AUTOINCREMENT
kennen Spaltenattribut und wann Sie es in Ihrer Tabelle verwenden.
Einführung in SQLite ROWID
Tabelle
Immer wenn Sie eine Tabelle erstellen, ohne WITHOUT ROWID
anzugeben -Option erhalten Sie eine implizite Auto-Increment-Spalte namens rowid
. Die rowid
Spalte speichert eine vorzeichenbehaftete 64-Bit-Ganzzahl, die eine Zeile in der Tabelle eindeutig identifiziert.
Sehen wir uns das folgende Beispiel an.
Erstellen Sie zunächst eine neue Tabelle mit dem Namen people
das hat zwei Spalten:first_name,
und last_name
:
CREATE TABLE people (
first_name TEXT NOT NULL,
last_name TEXT NOT NULL
);
Code language: SQL (Structured Query Language) (sql)
Probieren Sie es aus
Zweitens fügen Sie eine Zeile in people
ein Tabelle mit folgendem INSERT
Aussage:
INSERT INTO people (first_name, last_name)
VALUES('John', 'Doe');
Code language: SQL (Structured Query Language) (sql)
Probieren Sie es aus
Drittens fragen Sie Daten von den people
ab Tabelle mit dem folgenden SELECT
Aussage:
SELECT
rowid,
first_name,
last_name
FROM
people;
Code language: SQL (Structured Query Language) (sql)
Probieren Sie es aus
Wie Sie der Ausgabe deutlich entnehmen können, erstellt SQLite implizit eine Spalte mit dem Namen rowid
und weist automatisch einen ganzzahligen Wert zu, wenn Sie eine neue Zeile in die Tabelle einfügen.
Beachten Sie, dass Sie sich auch auf die rowid
beziehen können Spalte mit ihren Aliasen:_rowid_
und oid
.
Wenn Sie eine Tabelle erstellen, die einen INTEGER PRIMARY KEY
hat Spalte, diese Spalte ist der Alias der rowid
Spalte.
Die folgende Anweisung löscht die Tabelle people
und erstellt es neu. Dieses Mal fügen wir jedoch eine weitere Spalte namens person_id
hinzu dessen Datentyp INTEGER
ist und die Spaltenbeschränkung ist PRIMARY KEY
:
DROP TABLE people;
CREATE TABLE people (
person_id INTEGER PRIMARY KEY,
first_name TEXT NOT NULL,
last_name TEXT NOT NULL
);
Code language: SQL (Structured Query Language) (sql)
Probieren Sie es aus
In diesem Fall die person_id
Spalte ist eigentlich die rowid
Spalte.
Wie weist SQLite der rowid
einen ganzzahligen Wert zu Spalte?
Wenn Sie rowid
nicht angeben Wert oder Sie verwenden einen NULL
value Wenn Sie eine neue Zeile einfügen, weist SQLite automatisch die nächste sequenzielle Ganzzahl zu, die um eins größer ist als die größte rowid
in der Tabelle. Die rowid
Wert beginnt bei 1.
Der Höchstwert derrowid
Spalte ist 9,223,372,036,854,775,807
, was sehr groß ist. Wenn Ihre Daten diesen Maximalwert erreichen und Sie versuchen, eine neue Zeile einzufügen, findet SQLite eine nicht verwendete Ganzzahl und verwendet sie. Wenn SQLite keine ungenutzte ganze Zahl finden kann, gibt es ein SQLITE_FULL
aus Error. Wenn Sie darüber hinaus einige Zeilen löschen und eine neue Zeile einfügen, versucht SQLite, die rowid
wiederzuverwenden Werte aus den gelöschten Zeilen.
Lassen Sie uns einen Test machen.
Fügen Sie zuerst eine Zeile mit dem Maximalwert in people
ein Tabelle.
INSERT INTO people (person_id,first_name,last_name)
VALUES( 9223372036854775807,'Johnathan','Smith');
Code language: SQL (Structured Query Language) (sql)
Probieren Sie es aus
Zweitens fügen Sie eine weitere Zeile ein, ohne einen Wert für person_id
anzugeben Spalte:
INSERT INTO people (first_name,last_name)
VALUES('William','Gate');
Code language: SQL (Structured Query Language) (sql)
Probieren Sie es aus
Wie in der Ausgabe deutlich zu sehen ist, erhielt die neue Zeile eine unbenutzte Ganzzahl.
Betrachten Sie ein weiteres Beispiel.
Erstellen Sie zunächst eine neue Tabelle mit dem Namen t1
das hat eine Spalte:
CREATE TABLE t1(c text);
Code language: SQL (Structured Query Language) (sql)
Zweitens fügen Sie einige Zeilen in t1
ein Tabelle:
INSERT INTO t1(c) VALUES('A');
INSERT INTO t1(c) values('B');
INSERT INTO t1(c) values('C');
INSERT INTO t1(c) values('D');
Code language: SQL (Structured Query Language) (sql)
Fragen Sie drittens Daten von t1
ab Tabelle:
SELECT rowid, c FROM t1;
Code language: SQL (Structured Query Language) (sql)
Löschen Sie viertens alle Zeilen von t1
Tabelle:
DELETE FROM t1;
Code language: SQL (Structured Query Language) (sql)
Fügen Sie fünftens einige Zeilen in t1
ein Tabelle:
INSERT INTO t1(c) values('E');
INSERT INTO t1(c) values('F');
INSERT INTO t1(c) values('G');
Code language: SQL (Structured Query Language) (sql)
Fragen Sie abschließend Daten von t1
ab Tabelle:
SELECT rowid, c FROM t1;
Code language: SQL (Structured Query Language) (sql)
Wie Sie sehen können, wurden die Zeilen-IDs 1, 2 und 3 für die neuen Zeilen wiederverwendet.
SQLite AUTOINCREMENT
Spaltenattribut
SQLite empfiehlt, AUTOINCREMENT
nicht zu verwenden Attribut, weil:
Das
AUTOINCREMENT
Das Schlüsselwort verursacht zusätzlichen CPU-, Arbeitsspeicher-, Festplattenspeicher- und Festplatten-E/A-Overhead und sollte vermieden werden, wenn es nicht unbedingt erforderlich ist. Es wird normalerweise nicht benötigt.
Außerdem die Art und Weise, wie SQLite einen Wert für AUTOINCREMENT
zuweist Spalte etwas anders als bei der rowid
Spalte.
Betrachten Sie das folgende Beispiel.
Löschen Sie zuerst die people
und erstellen Sie sie neu Tisch. Dieses Mal verwenden wir AUTOINCREMENT
Attributspalte:
DROP TABLE people;
CREATE TABLE people (
person_id INTEGER PRIMARY KEY AUTOINCREMENT,
first_name text NOT NULL,
last_name text NOT NULL
);
Code language: SQL (Structured Query Language) (sql)
Probieren Sie es aus
Zweitens fügen Sie eine Zeile mit der maximalen rowid
ein Wert in die people
Tabelle.
INSERT INTO people (person_id,first_name,last_name)
VALUES(9223372036854775807,'Johnathan','Smith');
Code language: SQL (Structured Query Language) (sql)
Probieren Sie es aus
Drittens fügen Sie eine weitere Zeile in people
ein Tabelle.
INSERT INTO people (first_name,last_name)
VALUES('John','Smith');
Code language: SQL (Structured Query Language) (sql)
Probieren Sie es aus
Diesmal hat SQLite eine Fehlermeldung ausgegeben, weil die person_id
Spalte hat die Zahl nicht wie eine rowid
wiederverwendet Spalte.
[Err] 13 - database or disk is full
Code language: SQL (Structured Query Language) (sql)
Wann sollten Sie das AUTOINCREMENT
verwenden Spaltenattribut?
Der Hauptzweck der Verwendung des Attributs AUTOINCREMENT
soll SQLite daran hindern, einen nicht verwendeten Wert oder einen Wert aus der zuvor gelöschten Zeile wiederzuverwenden.
Wenn Sie keine solche Anforderung haben, sollten Sie das AUTOINCREMENT
nicht verwenden -Attribut im Primärschlüssel.
In diesem Tutorial haben Sie gelernt, wie SQLite AUTOINCREMENT
-Attribut funktioniert und wie es die Art und Weise beeinflusst, wie SQLite der Primärschlüsselspalte Werte zuweist.