SQLite: AutoIncrement Felder

Und es gibt sie wirklich!
Wenn man in der Doku schaut, wird man auch recht schnell fündig 🙂

Hier möchte ich die Unterschiede zwischen einem Normalen INTEGER Feld und dem AUTOINC Feld aufzeigen.

Ich habe bis jetzt immer Auto-INC Felder wie folgt erstellt:

1
2
3
4
CREATE TABLE [inctest] (
  [id] INTEGER PRIMARY KEY, 
  [datum] VARCHAR(20),
  [info] VARCHAR(50));

FĂĽgt man jetz Daten ein…

1
2
3
4
5
6
7
8
9
10
INSERT INTO inctest (datum,info) VALUES (DATETIME(),'erster Datensatz: 1');
INSERT INTO inctest (datum,info) VALUES (DATETIME(),'Datensatz ID: 2');
INSERT INTO inctest (datum,info) VALUES (DATETIME(),'Datensatz ID: 3');
INSERT INTO inctest (datum,info) VALUES (DATETIME(),'Datensatz ID: 4');
INSERT INTO inctest (datum,info) VALUES (DATETIME(),'Datensatz ID: 5');
INSERT INTO inctest (datum,info) VALUES (DATETIME(),'Datensatz ID: 6');
INSERT INTO inctest (datum,info) VALUES (DATETIME(),'Datensatz ID: 7');
INSERT INTO inctest (datum,info) VALUES (DATETIME(),'Datensatz ID: 8');
INSERT INTO inctest (datum,info) VALUES (DATETIME(),'Datensatz ID: 9');
INSERT INTO inctest (datum,info) VALUES (DATETIME(),'Datensatz ID: 10');

Hat man 10 Datensätze in der Tabelle:

id |datum               |info                
-- |------------------- |------------------- 
 1 |2010-11-30 16:59:18 |erster Datensatz: 1 
 2 |2010-11-30 16:59:18 |Datensatz ID: 2     
 3 |2010-11-30 16:59:18 |Datensatz ID: 3     
 4 |2010-11-30 16:59:18 |Datensatz ID: 4     
 5 |2010-11-30 16:59:18 |Datensatz ID: 5     
 6 |2010-11-30 16:59:18 |Datensatz ID: 6     
 7 |2010-11-30 16:59:18 |Datensatz ID: 7     
 8 |2010-11-30 16:59:18 |Datensatz ID: 8     
 9 |2010-11-30 16:59:18 |Datensatz ID: 9     
10 |2010-11-30 16:59:18 |Datensatz ID: 10    

Löscht man jetzt alle Datensätze > 5…

1
DELETE FROM inctest WHERE ID>5;

Und Fügt nun wieder 5 neue Datensätzte ein:

1
2
3
4
5
INSERT INTO inctest (datum,info) VALUES (DATETIME(),'Datensatz ID: sollte 11');
INSERT INTO inctest (datum,info) VALUES (DATETIME(),'Datensatz ID: sollte 12');
INSERT INTO inctest (datum,info) VALUES (DATETIME(),'Datensatz ID: sollte 13');
INSERT INTO inctest (datum,info) VALUES (DATETIME(),'Datensatz ID: sollte 14');
INSERT INTO inctest (datum,info) VALUES (DATETIME(),'Datensatz ID: sollte 15');

Passiert folgendes:

id |datum               |info                    
-- |------------------- |----------------------- 
 1 |2010-11-30 17:10:28 |erster Datensatz: 1     
 2 |2010-11-30 17:10:28 |Datensatz ID: 2         
 3 |2010-11-30 17:10:28 |Datensatz ID: 3         
 4 |2010-11-30 17:10:28 |Datensatz ID: 4         
 5 |2010-11-30 17:10:28 |Datensatz ID: 5         
 6 |2010-11-30 17:11:08 |Datensatz ID: sollte 11 
 7 |2010-11-30 17:11:08 |Datensatz ID: sollte 12 
 8 |2010-11-30 17:11:08 |Datensatz ID: sollte 13 
 9 |2010-11-30 17:11:08 |Datensatz ID: sollte 14 
10 |2010-11-30 17:11:08 |Datensatz ID: sollte 15 

Das Bedeutet: Wird die Letzte Zeile einer Tabelle gelöscht, so wird deren PrimaerID wieder für die Benutzung frei gegeben.
Dies Kann zu Inkonsistenten Daten fĂĽhren – Aus diesem Grund war ich bis jetzt immer recht vorsichtig mit diesen Feldern.

Heute habe ich zufällig gesehen, das es auch ein ECHTES AutoINC-Feld in SQLITE gibt.
Damit definiert man eine Tabelle wie folgt:

1
2
3
4
CREATE TABLE [inctest] (
  [id] INTEGER PRIMARY KEY AUTOINCREMENT, 
  [datum] VARCHAR(20),
  [info] VARCHAR(50));

Wenn wir jetzt wieder selbiges spielchen wie oben treiben (10 Datensaätze rein, 5 raus, wieder 5 rein), dann sehen wir:

id |datum               |info                    
-- |------------------- |----------------------- 
 1 |2010-11-30 17:16:06 |erster Datensatz: 1     
 2 |2010-11-30 17:16:06 |Datensatz ID: 2         
 3 |2010-11-30 17:16:06 |Datensatz ID: 3         
 4 |2010-11-30 17:16:06 |Datensatz ID: 4         
 5 |2010-11-30 17:16:06 |Datensatz ID: 5         
11 |2010-11-30 17:17:57 |Datensatz ID: sollte 11 
12 |2010-11-30 17:17:57 |Datensatz ID: sollte 12 
13 |2010-11-30 17:17:57 |Datensatz ID: sollte 13 
14 |2010-11-30 17:17:57 |Datensatz ID: sollte 14 
15 |2010-11-30 17:17:57 |Datensatz ID: sollte 15 

Damit haben wir ein richitges Auto-INC, welches eine ID auch nur ein mal vergibt 🙂

PS: folgendes gibt ĂĽbrigens die zuletz eingefĂĽgte ID wieder aus:

1
SELECT last_insert_rowid() AS LID

leave your comment


*

UnterstĂĽtze den Frickelblog!