Ich habe eine Tabelle mit Spalten name
, qty
, rate
. Jetzt muss ich eine neue Spalte COLNew
zwischen den Spalten name
und hinzufügen qty
. Wie füge ich eine neue Spalte zwischen zwei Spalten hinzu?
354
Sie haben zwei Möglichkeiten. Zunächst können Sie einfach eine neue Spalte mit den folgenden Angaben hinzufügen:
ALTER TABLE {tableName} ADD COLUMN COLNew {type};
Zweitens und komplizierter, aber würde die Spalte tatsächlich dort platzieren, wo Sie es möchten, wäre es, die Tabelle umzubenennen:
ALTER TABLE {tableName} RENAME TO TempOldTable;
Erstellen Sie dann die neue Tabelle mit der fehlenden Spalte:
CREATE TABLE {tableName} (name TEXT, COLNew {type} DEFAULT {defaultValue}, qty INTEGER, rate REAL);
Und füllen Sie es mit den alten Daten:
INSERT INTO {tableName} (name, qty, rate) SELECT name, qty, rate FROM TempOldTable;
Dann löschen Sie die alte Tabelle:
DROP TABLE TempOldTable;
Ich würde die zweite Option sehr bevorzugen, da Sie damit bei Bedarf alles komplett umbenennen können.
PRAGMA foreign_keys = ON;
(siehe sqlite.org/foreignkeys.html#fk_enable )Sie fügen keine Spalten zwischen anderen Spalten in SQL hinzu, sondern fügen sie nur hinzu. Wo sie hingelegt werden, liegt ganz beim DBMS. Der richtige Ort, um sicherzustellen, dass die Spalten in der richtigen Reihenfolge angezeigt werden, ist bei Ihnen
select
sie haben.Mit anderen Worten, wenn Sie sie in der Reihenfolge haben möchten
{name,colnew,qty,rate}
, verwenden Sie:Mit SQLite müssen Sie Folgendes verwenden
alter table
: Ein Beispiel ist:quelle
SELECT * FROM mytable
?select *
. Es ist manchmal praktisch für Programme, die Tabellen ermitteln möchten, aber für die meisten Verwendungszwecke sollten Sie explizit angeben, was Sie möchten und daher die Reihenfolge, in der Sie es möchten.Sie können der Abfrage eine neue Spalte hinzufügen
Es wird jedoch am Ende hinzugefügt, nicht zwischen den vorhandenen Spalten.
quelle
SQLite bietet nur eingeschränkte Unterstützung für ALTER TABLE, mit der Sie eine Spalte am Ende einer Tabelle hinzufügen oder den Namen einer Tabelle ändern können.
Wenn Sie komplexere Änderungen an der Struktur einer Tabelle vornehmen möchten, müssen Sie die Tabelle neu erstellen. Sie können vorhandene Daten in einer temporären Tabelle speichern, die alte Tabelle löschen, die neue Tabelle erstellen und die Daten dann wieder aus der temporären Tabelle kopieren.
Angenommen, Sie haben eine Tabelle mit dem Namen "t1" mit den Spaltennamen "a" und "c" und möchten die Spalte "b" aus dieser Tabelle einfügen. Die folgenden Schritte veranschaulichen, wie dies getan werden kann:
Jetzt können Sie Ihre neuen Daten wie folgt einfügen:
quelle
INSERT INTO t1 SELECT a,c FROM t1_backup;
verursacht die Zeile den Fehler: "Tabelle t1 hat 3 Spalten, aber 2 Werte wurden angegeben: INSERT IN t1 SELECT a, c FROM t1_backup;". Die richtige Zeile sollte seinINSERT INTO t1 (a,c) SELECT a,c FROM t1_backup;
Dieses Update ist erforderlich, um den Nullwert zu verarbeiten und nach Bedarf einen Standardwert einzugeben. Wie in Ihrem Fall müssen Sie die
SELECT
Abfrage aufrufen und erhalten die Reihenfolge der Spalten, wie paxdiablo bereits sagte:und meiner Meinung nach Ihr Spaltenname, um den Wert vom Cursor zu erhalten:
Wenn sich der Index ändert, treten bei Ihrer Anwendung keine Probleme auf.
Dies ist der sichere Weg in dem Sinne, dass andernfalls bei Verwendung
CREATE temptable
oderRENAME table
oderCREATE
eine hohe Wahrscheinlichkeit eines Datenverlusts besteht, wenn er nicht sorgfältig behandelt wird, z. B. wenn Ihre Transaktionen stattfinden, während der Akku leer ist.quelle
Ich hatte das gleiche Problem und die zweite in der akzeptierten Antwort vorgeschlagene Methode, wie in den Kommentaren angegeben, kann beim Umgang mit Fremdschlüsseln problematisch sein.
Meine Problemumgehung besteht darin, die Datenbank in eine SQL-Datei zu exportieren und sicherzustellen, dass die INSERT-Anweisungen Spaltennamen enthalten. Ich mache es mit DB Browser für SQLite der eine praktische Funktion dafür hat. Danach müssen Sie nur noch die Anweisung create table bearbeiten und die neue Spalte an der gewünschten Stelle einfügen und die Datenbank neu erstellen.
In * nix-ähnlichen Systemen ist nur etwas in der Art von
Ich weiß nicht, wie machbar dies mit sehr großen Datenbanken ist, aber es hat in meinem Fall funktioniert.
quelle