Ich müsste einige Spalten in einigen Tabellen in einer SQLite-Datenbank umbenennen. Ich weiß, dass zuvor eine ähnliche Frage zum Stackoverflow gestellt wurde, aber es war für SQL im Allgemeinen, und der Fall von SQLite wurde nicht erwähnt.
Aus der SQLite-Dokumentation für ALTER TABLE geht hervor, dass es nicht möglich ist, so etwas "einfach" zu machen (dh eine einzelne ALTER TABLE-Anweisung).
Ich habe mich gefragt, ob jemand eine generische SQL-Methode kennt, um so etwas mit SQLite zu tun.
sqlite
alter-table
joce
quelle
quelle
Antworten:
Dies wurde gerade mit 2018-09-15 (3.25.0) behoben
Die neue Syntax finden Sie unter
ALTER TABLE
Bildquelle: https://www.sqlite.org/images/syntax/alter-table-stmt.gif
Beispiel:
db-fiddle.com Demo
Android-Unterstützung
Wie des Schreibens, 27 Androids API SQLite Paket Version 3.19 verwendet .
Basierend auf der aktuellen Version, die Android verwendet, und dass dieses Update in Version 3.25.0 von SQLite verfügbar ist, würde ich sagen, dass Sie etwas warten müssen (ungefähr API 33), bevor die Unterstützung für Android hinzugefügt wird.
Und selbst dann, wenn Sie Versionen unterstützen müssen, die älter als die API 33 sind, können Sie diese nicht verwenden.
quelle
database.execSQL("ALTER TABLE content RENAME COLUMN archiveCount TO dismissCount")
. COLUM ist rot hervorgehoben und es steht TO erwartet, hat 'COLUMN' . Leider ist Android immer noch auf SQLite Version 3.19 , weshalb dies bei mir nicht funktioniert.Angenommen, Sie haben eine Tabelle und müssen "colb" in "col_b" umbenennen:
Zuerst benennen Sie die alte Tabelle um:
Erstellen Sie dann die neue Tabelle basierend auf der alten Tabelle, jedoch mit dem aktualisierten Spaltennamen:
Kopieren Sie dann den Inhalt gegenüber der Originaltabelle.
Lassen Sie zum Schluss den alten Tisch fallen.
All dies in ein
BEGIN TRANSACTION;
und einwickelnCOMMIT;
ist wahrscheinlich auch eine gute Idee.quelle
.schema
Befehl ist praktisch, um dieCREATE TABLE
Anweisung anzuzeigen, aus der die vorhandene Tabelle besteht. Sie können die Ausgabe übernehmen, nach Bedarf ändern und ausführen, um die neue Tabelle zu erstellen. Dieser Befehl zeigt auch die erforderlichenCREATE INDEX
Befehle zum Erstellen der Indizes an, die die Bedenken von Thomas abdecken sollten. Führen Sie diesen Befehl unbedingt aus, bevor Sie Änderungen vornehmen.Beim Stöbern fand ich dieses grafische Multiplattform-Tool (Linux | Mac | Windows) namens DB Browser for SQLite , mit dem man Spalten auf sehr benutzerfreundliche Weise umbenennen kann!
Bearbeiten | Tabelle ändern | Wählen Sie Tabelle | Feld bearbeiten. Klick klick! Voila!
Wenn jedoch jemand eine programmatische Vorgehensweise teilen möchte, würde ich mich freuen zu wissen!
quelle
Es ist zwar richtig, dass es keine ALTER COLUMN gibt. Wenn Sie jedoch nur die Spalte umbenennen, die NOT NULL-Einschränkung löschen oder den Datentyp ändern möchten, können Sie die folgenden Befehle verwenden:
Hinweis: Diese Befehle können Ihre Datenbank möglicherweise beschädigen. Stellen Sie daher sicher, dass Sie über ein Backup verfügen
Sie müssen entweder Ihre Verbindung schließen und erneut öffnen oder die Datenbank staubsaugen, um die Änderungen erneut in das Schema zu laden.
Zum Beispiel:
FOLGENDE REFERENZEN:
pragma writable_schema
Wenn dieses Pragma aktiviert ist, die SQLITE_MASTER-Tabellen, in denen die Datenbank mit normalen UPDATE-, INSERT- und DELETE-Anweisungen geändert werden kann. Warnung: Der Missbrauch dieses Pragmas kann leicht zu einer beschädigten Datenbankdatei führen.
alter table
SQLite unterstützt eine begrenzte Teilmenge von ALTER TABLE. Mit dem Befehl ALTER TABLE in SQLite kann der Benutzer eine Tabelle umbenennen oder einer vorhandenen Tabelle eine neue Spalte hinzufügen. Es ist nicht möglich, eine Spalte umzubenennen, eine Spalte zu entfernen oder Einschränkungen zu einer Tabelle hinzuzufügen oder daraus zu entfernen.
quelle
Vor kurzem musste ich das in SQLite3 mit einer Tabelle namens points mit der Spalte id, lon, lat tun . Wenn die Tabelle importiert wurde, wurden fälschlicherweise die Werte für den Breitengrad in der Spalte lon und umgekehrt gespeichert. Daher wäre es naheliegend, diese Spalten umzubenennen. Der Trick war also:
Ich hoffe das wäre nützlich für dich!
quelle
Zitieren der SQLite-Dokumentation :
Sie können natürlich eine neue Tabelle mit dem neuen Layout erstellen
SELECT * FROM old_table
und die neue Tabelle mit den Werten füllen, die Sie erhalten.quelle
Zunächst einmal ist dies eines der Dinge, die mich überrascht ins Gesicht schlagen: Das Umbenennen einer Spalte erfordert das Erstellen einer völlig neuen Tabelle und das Kopieren der Daten von der alten Tabelle in die neue Tabelle ...
Die GUI, auf der ich gelandet bin, um SQLite-Operationen auszuführen, ist Base . Es hat ein geschicktes Protokollfenster, das alle ausgeführten Befehle anzeigt. Wenn Sie eine Spalte über Base umbenennen, wird das Protokollfenster mit den erforderlichen Befehlen gefüllt:
Diese können dann einfach kopiert und dort eingefügt werden, wo Sie sie benötigen. Für mich ist das eine ActiveAndroid- Migrationsdatei. Eine nette Geste ist auch, dass die kopierten Daten nur die SQLite-Befehle enthalten, nicht die Zeitstempel usw.
Hoffentlich spart das einigen Leuten Zeit.
quelle
BEGIN TRANSACTION;
undCOMMIT;
Linien, wie ActiveAndroid Griffe , die von selbst aus .FALL 1: SQLite 3.25.0+
Nur die Version 3.25.0 von SQLite unterstützt das Umbenennen von Spalten. Wenn Ihr Gerät diese Anforderung erfüllt, sind die Dinge ganz einfach. Die folgende Abfrage würde Ihr Problem lösen:
FALL 2: Ältere SQLite-Versionen
Sie müssen einen anderen Ansatz verfolgen, um das Ergebnis zu erhalten, das möglicherweise etwas schwierig ist
Wenn Sie beispielsweise eine Tabelle wie diese haben:
Und wenn Sie den Namen der Spalte ändern möchten
Location
Schritt 1: Benennen Sie die ursprüngliche Tabelle um:
Schritt 2: Erstellen Sie nun eine neue Tabelle
student
mit dem richtigen Spaltennamen:Schritt 3: Kopieren Sie die Daten aus der ursprünglichen Tabelle in die neue Tabelle:
Hinweis: Der obige Befehl sollte nur aus einer Zeile bestehen.
Schritt 4: Legen Sie die Originaltabelle ab:
Mit diesen vier Schritten können Sie jede SQLite-Tabelle manuell ändern. Beachten Sie, dass Sie auch alle Indizes, Viewer oder Trigger für die neue Tabelle neu erstellen müssen.
quelle
Ändern Sie die Tabellenspalte <ID> in <_id>
quelle
Erstellen Sie eine neue Spalte mit dem gewünschten Spaltennamen: COLNew.
Kopieren Sie den Inhalt der alten Spalte COLOld in die neue Spalte COLNew.
Hinweis: In der obigen Zeile sind Klammern erforderlich.
quelle
Wie bereits erwähnt, gibt es ein Tool SQLite Database Browser, das dies tut. Dieses Tool führt ein Protokoll aller vom Benutzer oder der Anwendung ausgeführten Vorgänge. Wenn Sie dies einmal tun und das Anwendungsprotokoll anzeigen, wird der betreffende Code angezeigt. Kopieren Sie die Abfrage und fügen Sie sie nach Bedarf ein. Hat für mich gearbeitet. Hoffe das hilft
quelle
Aus der offiziellen Dokumentation
Ein einfacheres und schnelleres Verfahren kann optional für einige Änderungen verwendet werden, die den Inhalt auf der Festplatte in keiner Weise beeinflussen. Das folgende einfachere Verfahren eignet sich zum Entfernen von CHECK- oder FOREIGN KEY- oder NOT NULL-Einschränkungen, zum Umbenennen von Spalten oder zum Hinzufügen oder Entfernen oder Ändern von Standardwerten für eine Spalte.
Starten Sie eine Transaktion.
Führen Sie PRAGMA schema_version aus, um die aktuelle Versionsnummer des Schemas zu ermitteln. Diese Nummer wird für Schritt 6 unten benötigt.
Aktivieren Sie die Schema-Bearbeitung mit PRAGMA writable_schema = ON.
Führen Sie eine UPDATE-Anweisung aus, um die Definition von Tabelle X in der Tabelle sqlite_master zu ändern: UPDATE sqlite_master SET sql = ... WHERE type = 'table' AND name = 'X';
Achtung: Wenn Sie eine solche Änderung an der Tabelle sqlite_master vornehmen, wird die Datenbank beschädigt und unlesbar, wenn die Änderung einen Syntaxfehler enthält. Es wird empfohlen, die UPDATE-Anweisung sorgfältig in einer separaten leeren Datenbank zu testen, bevor sie in einer Datenbank mit wichtigen Daten verwendet wird.
Wenn sich die Änderung an Tabelle X auch auf andere Tabellen oder Indizes auswirkt oder Trigger Ansichten innerhalb des Schemas sind, führen Sie UPDATE-Anweisungen aus, um auch diese anderen Tabellenindizes und -ansichten zu ändern. Wenn sich beispielsweise der Name einer Spalte ändert, müssen alle FOREIGN KEY-Einschränkungen, Trigger, Indizes und Ansichten, die auf diese Spalte verweisen, geändert werden.
Achtung: Wenn Sie erneut Änderungen an der Tabelle sqlite_master vornehmen, wird die Datenbank beschädigt und unlesbar, wenn die Änderung einen Fehler enthält. Testen Sie diese gesamte Prozedur sorgfältig in einer separaten Testdatenbank, bevor Sie sie in einer Datenbank mit wichtigen Daten verwenden, und / oder erstellen Sie Sicherungskopien wichtiger Datenbanken, bevor Sie diese Prozedur ausführen.
Erhöhen Sie die Versionsnummer des Schemas mit PRAGMA schema_version = X, wobei X eins mehr ist als die alte Versionsnummer des Schemas in Schritt 2 oben.
Deaktivieren Sie die Schema-Bearbeitung mit PRAGMA writable_schema = OFF.
(Optional) Führen Sie PRAGMA Integritätsprüfung aus, um sicherzustellen, dass die Schemaänderungen die Datenbank nicht beschädigt haben.
Übernehmen Sie die in Schritt 1 oben gestartete Transaktion.
quelle
Eine Option, wenn Sie es zur Not erledigen müssen und wenn Ihre ursprüngliche Spalte mit einer Standardeinstellung erstellt wurde, besteht darin, die gewünschte neue Spalte zu erstellen, den Inhalt darauf zu kopieren und die alte Spalte im Grunde zu "verlassen" (sie bleibt erhalten) vorhanden, aber Sie verwenden / aktualisieren es einfach nicht usw.)
Ex:
Dies hinterlässt eine Spalte (und wenn sie mit NOT NULL, aber ohne Standard erstellt wurde, schlagen zukünftige Einfügungen, die sie ignorieren, möglicherweise fehl), aber wenn es sich nur um eine Wegwerftabelle handelt, sind die Kompromisse möglicherweise akzeptabel. Verwenden Sie andernfalls eine der anderen hier genannten Antworten oder eine andere Datenbank, in der Spalten umbenannt werden können.
quelle
Seit der Version 2018-09-15 (3.25.0) unterstützt sqlite das Umbenennen von Spalten
https://sqlite.org/changes.html
quelle
sqlite3 yourdb .dump> /tmp/db.txt
edit /tmp/db.txt Spaltenname in Zeile
erstellen ändern sqlite2 yourdb2 </tmp/db.txt
mv / move yourdb2 yourdb
quelle