2016-04-11 14 views
0

Ich erstelle eine Tabelle, die auf der ersten keyID-Spalte NICHT in AUTO INCREMENT ist, da ich Daten einfügen werde, die aus einer alten Datenbank stammen, wo die keyID bereits für jede Zeile gesetzt wurde und es ist nicht möglich, geändert zu werden. Ist es also möglich, dass ich die Spalte auf AUTO INCREMENT stellen kann, nachdem alle Daten verschoben wurden? Ich habe gesehen:Automatisches Inkrementieren einer Spalte in SQLite ändern

ALTER TABLE tbl_name MODIFY COLUMN keyID_id INT auto_increment 

Also, wenn überhaupt habe ich die Schlüssel-ID Zuwachs auf Auto, nachdem ich alle Daten bewegt, so zum Beispiel 10 Zeilen übertragen wurde und einige Nummern können beispielsweise fehlen, keyIDs: 1 , 2,3,5,6,7 ... 15

kann ich davon ausgehen, dass die nächste Zeile keyID 16 ist, nachdem ich die keyID auf auto increment gesetzt habe?

+0

Sie * können * explizite Werte in eine Autoinkrement-Spalte einfügen. –

+0

also sagst du ... Ich kann die Tabellenspalte automatisch erhöhen und ich kann Daten mit spezifischer ID einfügen? –

+0

Die [Dokumentation] (http://www.sqlite.org/autoinc.html) sagt: "Wenn bei einem INSERT die Spalte ROWID oder INTEGER PRIMARY KEY nicht explizit einen Wert erhält, wird sie automatisch mit einem gefüllt unbenutzte ganze Zahl ... " –

Antwort

0

Die erste Sache, die hier zu sagen ist, dass SQLite keine Syntax hat, um die Einstellungen einer Spalte zu ändern. Sie müssen Ihre ursprüngliche Tabelle umbenennen, eine neue Tabelle mit dem gewünschten Schema erstellen und dann aus der umbenannten Tabelle in die neue Tabelle kopieren.

So Ihr Code die AUTOINCREMENT Flagge zu Ihrer Tabelle hinzuzufügen ist so etwas wie dieses

SQLiteCommand cmd = new SQLiteCommand(); 
cmd.Connection = yourConnection; 
cmd.CommandText = "ALTER TABLE tblName RENAME TO tmp_tblName"; 
cmd.ExecuteNonQuery(); 
cmd = new SQLiteCommand(@" 
    CREATE TABLE tblName 
    (ID INTEGER PRIMARY KEY AUTOINCREMENT, 
    AnotherField NVARCHAR(100) NOT NULL)", cnn); 
cmd.ExecuteNonQuery();    
cmd.CommandText = "INSERT INTO tblName (ID, AnotherField) SELECT ID, AnotherField FROM tmp_tblName"; 
cmd.ExecuteNonQuery(); 

Nun, wenn Sie eine Tabelle mit dem AUTOINCREMENT SQLite fügen Sie eine neue Zeile in eine interne Tabelle sqlite_sequence genannt erstellen. Diese Tabelle kann durch die üblichen ADO.NET-Klassen gelesen werden

cmd.CommandText = "SELECT seq FROM sqlite_sequence WHERE name = 'tblName'"; 
int lastInsertedValue = Convert.ToInt32(cmd.ExecuteScalar()); 
Console.WriteLine(lastInsertedValue); 

Wenn Ihr Lauf dieser Test Code, den Sie wird der Wert für das Feld f sehen, dass im Primärschlüsselfeld eingefügt gleich dem Maximalwert ist. Wenn Sie danach versuchen, einen neuen Datensatz in Ihre Tabelle einzufügen, sehen Sie, dass das AUTOINCREMENT-Flag wie erwartet funktioniert und Ihr neuer Datensatz den nächsten Wert aus der Sequenz erhält.

0

Obwohl die SQLite documentation und someposts Zustand, dass der alter table-Befehl in SQLite sehr begrenzt ist und nicht erlauben sollte, solche Änderungen vorzunehmen, scheint es, dass es immer noch möglich ist, PK-Eigenschaften zu ändern. Was für mich gearbeitet wurde:

  1. Erstellen Sie eine Tabelle mit CREATE TABLE "test" ( Field1 INTEGER, Field2 TEXT,)
  2. Einfügen beliebiger Daten
  3. ändern Spaltendefinition für Spalte Field1 mit DB Browser for SQLite Folgeeinsätze sollten dann die IDs Autoinkrement in der Spalte Feld1.

Ich muss zugeben, dass es möglicherweise nicht geeignet ist, wenn es die Anforderung, dies programmatisch zu tun, aber wenn einige manuelle Schritte akzeptabel sind, kann es eine Lösung sein.

Verwandte Themen