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

SQLite AUTOINCREMENT

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 fullCode 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.