hawkmaster: SQLite Autoincrement

Hallo zusammen,

laut SQLite Doku bekommt eine Spalte einen Autoincrement wenn sie als "INTEGER PRIMARY KEY" definiert wurde.
Wenn ich es richtig verstanden habe, kann man aber auch noch den Key AUTOINCREMENT angeben. Dann würde man eine "dauerhafte" eindeutige ID über die gesamte Lebenszeit der Tabelle bekommen. Mit "Autoincrement" wird die letzte und höchste ID in der internen Tabelle "sqlite_sequence" gespeichert.
Ich hoffe das stimmt so?

In der Doku steht auch das mit AUTOINCREMENT die Inserts etwas langsamer wären.

Ich bin daher nicht sicher ob das wirklich notwendig ist und ob "INTEGER PRIMARY KEY" nicht ausreicht? Angenommen man hat 15 Zeilen in einer Tabelle mit Id 1-15 und man löscht die Zeile 12, dann ist beim nächsten Insert doch trotzdem die Id = 16.

Angenommen man hat ein Bestellsystem wo die ID die eindeutige Auftragsnummer sein soll. Wäre es hier richtig zusätzlich den Key AUTOINCREMENT zu nehmen?

vielen Dank und viele Grüße
hawk

  1. Meine Herren!

    Ich bin daher nicht sicher ob das wirklich notwendig ist und ob "INTEGER PRIMARY KEY" nicht ausreicht? Angenommen man hat 15 Zeilen in einer Tabelle mit Id 1-15 und man löscht die Zeile 12, dann ist beim nächsten Insert doch trotzdem die Id = 16.

    Ja, aber wenn du die Zeile 15 löschst, wäre die nächste Id wieder 15. Unter Verwendung von AUTOINCREMENT dagegen 16, weil bereits mal eine Zeile mit der Id 15 existiert hat.

    Angenommen man hat ein Bestellsystem wo die ID die eindeutige Auftragsnummer sein soll. Wäre es hier richtig zusätzlich den Key AUTOINCREMENT zu nehmen?

    M.M.n. ja. Die Gewschwindigkeits-Einbußen bewegen sich übrigens im kaum messbaren Bereich, zumindest wird das kein Leck öffnen.

    --
    “All right, then, I'll go to hell.”
    1. Hallo

      <<Ja, aber wenn du die Zeile 15 löschst, wäre die nächste Id wieder 15.

      Nicht unbedingt. Zumindest verhält sich meine Sqlite Test DB nicht so. Auch wenn ich eine Zeile lösche z.b. mit der ID 15, wird bei einem neuen Insert mit ID 16 weitergemacht. (Ohne Keyword AUTOINCREMENT)
      Ich glaube erst wenn der maximale Wert der ID (65 Bit integer) erreicht wird und es "Lücken" wegen gelöschten IDs gibt, wird eine alte ID verwendet.

      viele Grüße
      hawk

      1. Meine Herren!

        Ja, aber wenn du die Zeile 15 löschst, wäre die nächste Id wieder 15.

        Nicht unbedingt. Zumindest verhält sich meine Sqlite Test DB nicht so.

        Das wundert mich, der Algorithmus ist nämlich ziemlich eundeutig in dem Punkt:
        http://www.sqlite.org/autoinc.html

        Ich glaube erst wenn der maximale Wert der ID (65 Bit integer) erreicht wird und es "Lücken" wegen gelöschten IDs gibt, wird eine alte ID verwendet.

        Das ist ein weiterer Punkt.
        Auf jeden Fall gilt, dass AUTOINCREMENT dir eine Garantie gibt, dass eine ID nicht mehrfach vergeben wird, die du sonst nicht hast. In deinem Fall scheint das gefordert zu sein.

        --
        “All right, then, I'll go to hell.”