Frage

Ich habe eine Tabelle in meiner Datenbank mit einem Feld, das als deklariert ist

_id integer primary key

Es gibt kein AUTOINCREMENT.

Hier habe ich Zweifel, wie die Zeilen-ID beim Einfügen nach einem Löschvorgang aktualisiert wird.Was ich beobachtet habe ist

  1. Wenn die letzte Zeilen-ID x ist und gelöscht wird, erhält die nächste eingefügte Zeile die ID x.

Aber wenn ich einige andere Zeilen mit der ID < x lösche und dann eine neue Zeile einfüge, ist die Zeilen-ID der neu eingefügten Zeile x+1 .

Bitte bestätigen Sie, dass mein Beobachtungsrecht besteht (Zeilen-ID wird nur dann wiederverwendet, wenn die letzten Zeilen gelöscht werden und nicht zwischen den Zeilen.)

Ich habe die Erklärung für AUTOINCREMENT gesehen.Ich möchte das Verhalten wissen, wenn kein AUTOINCREMENT festgelegt ist

War es hilfreich?

Lösung

Das Autoincrement-Schlüsselwort ist nicht für SQLite-Tabellen erforderlich, um automatisch primäre Schlüsselwerte zu generieren. Was auch immer Sie in die Datenbank hinzufügen, wird als letzte Zeile hinzugefügt ... Wenn Sie also letzte Zeile (x) löschen .. Das neue Element wird bei X-Position hinzugefügt .. Wenn Sie aus der Mitte oder nicht löschen .. Neues ElementDie Zugabe geht auf x + 1-Position ...

Bei der Verwendung von Auto-Inkrement. Wenn Sie das letzte Element bei X-Position löschen

Andere Tipps

Ohne einen Autoinkrementierungssatz wäre die Zeile ein Alias ​​für die ROWID ...

Das steht in der FAQ:

Wenn in der Einfügung keine ROWID angegeben ist oder die angegebene ROWID den Wert NULL hat, wird automatisch eine entsprechende ROWID erstellt.Der übliche Algorithmus besteht darin, der neu erstellten Zeile eine ROWID zu geben, die um eins größer ist als die größte ROWID in der Tabelle vor dem Einfügen.Wenn die Tabelle zunächst leer ist, wird eine ROWID von 1 verwendet.Wenn die größte ROWID gleich der größtmöglichen Ganzzahl (9223372036854775807) ist, beginnt die Datenbank-Engine mit der zufälligen Auswahl positiver ROWID-Kandidaten, bis sie eine findet, die zuvor noch nicht verwendet wurde.Wenn nach einer angemessenen Anzahl von Versuchen keine ungenutzte ROWID gefunden werden kann, schlägt der Einfügevorgang mit einem SQLITE_FULL-Fehler fehl.Wenn keine negativen ROWID-Werte explizit eingefügt werden, sind automatisch generierte ROWID-Werte immer größer als Null.

Der oben beschriebene normale ROWID-Auswahlalgorithmus generiert monoton ansteigende eindeutige ROWIDs, solange Sie niemals den maximalen ROWID-Wert verwenden und niemals den Eintrag in der Tabelle mit der größten ROWID löschen.Wenn Sie jemals Zeilen löschen oder eine Zeile mit der maximal möglichen ROWID erstellen, werden ROWIDs aus zuvor gelöschten Zeilen beim Erstellen neuer Zeilen möglicherweise wiederverwendet und neu erstellte ROWIDs sind möglicherweise nicht in streng aufsteigender Reihenfolge.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top