/ / In welchen Fällen sollte AUTOINCREMENT anstelle der Standard-ROW-ID verwendet werden? - sqlite, sqlite3

In welchen Fällen sollte AUTOINCREMENT anstelle der Standard-ROW ID verwendet werden? - sqlite, sqlite3

In Sqlite gibt es zwei Möglichkeiten, monoton steigende Primärschlüsselwerte zu erstellen, die von der Datenbank-Engine durch die Standardeinstellung generiert werden ROWID Mechanismus oder durch die AUTOINCREMENT Mechanismus.

sqlite> -- Through the default ROWID mechanism
sqlite> CREATE TABLE foo(id INTEGER NOT NULL PRIMARY KEY, foo);
sqlite> INSERT INTO foo (foo) VALUES ("foo");
sqlite> INSERT INTO foo (foo) VALUES ("bar");
sqlite> SELECT * FROM foo;
1|foo
2|bar
sqlite>
sqlite> -- Through the AUTOINCREMENT mechanism
sqlite> CREATE TABLE bar(id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, bar);
sqlite> INSERT INTO bar (bar) VALUES ("foo");
sqlite> INSERT INTO bar (bar) VALUES ("bar");
sqlite> SELECT * FROM bar;
1|foo
2|bar
sqlite> -- Only the AUTOINCREMENT mechanism uses the sqlite_sequence table
sqlite> SELECT * FROM sqlite_sequence WHERE name in ("foo", "bar");
bar|2

Das Dokumentation scheint die Verwendung von AUTOINCREMENT ist schlecht:

Das Schlüsselwort AUTOINCREMENT erzwingt zusätzliche CPU-, Arbeitsspeicher-, Speicherplatz- und E / A-Kosten für Festplatten und sollte vermieden werden, wenn dies nicht unbedingt erforderlich ist. Es wird normalerweise nicht benötigt.

Wenn nach das Schlüsselwort AUTOINCREMENT angezeigt wirdINTEGER PRIMARY KEY, der den automatischen ROWID-Zuweisungsalgorithmus ändert, um die Wiederverwendung von ROWIDs während der Lebensdauer der Datenbank zu verhindern. Mit anderen Worten, der Zweck von AUTOINCREMENT besteht darin, die Wiederverwendung von ROWIDs aus zuvor gelöschten Zeilen zu verhindern.

[Mit AUTOINCREMENT] verfolgt SQLite denDie größte ROWID, die eine Tabelle jemals unter Verwendung einer internen Tabelle namens "sqlite_sequence" gehalten hat. Die sqlite_sequence-Tabelle wird automatisch erstellt und initialisiert, wenn eine normale Tabelle erstellt wird, die eine AUTOINCREMENT-Spalte enthält. Der Inhalt der sqlite_sequence-Tabelle kann mit den üblichen UPDATE-, INSERT- und DELETE-Anweisungen geändert werden. Änderungen an dieser Tabelle können jedoch den AUTOINCREMENT-Schlüsselgenerierungsalgorithmus stören. Stellen Sie sicher, dass Sie wissen, was Sie tun, bevor Sie solche Änderungen vornehmen.


In welchen Fällen ist es sinnvoll, das Schlüsselwort AUTOINCREMENT zu verwenden?

Antworten:

2 für die Antwort № 1

Die Dokumentation sagt das

Der Zweck von AUTOINCREMENT besteht darin, die Wiederverwendung von ROWIDs aus zuvor gelöschten Zeilen zu verhindern.

Daher ist es angebracht, AUTOINCREMENT zu verwendenSchlüsselwort, wenn Sie die Wiederverwendung von ROWIDs aus zuvor gelöschten Zeilen verhindern müssen. Dies kann erforderlich sein, wenn Sie externe Verweise auf diese gelöschten Zeilen haben und diese nicht mit neuen Zeilen verwechseln dürfen.