webentwicklung-frage-antwort-db.com.de

Wie benenne ich eine Spalte in einer SQLite-Datenbanktabelle um?

Ich würde einige Spalten in einigen Tabellen in einer SQLite-Datenbank umbenennen müssen. Ich weiß, dass ein ähnliche Frage zuvor beim Stackoverflow gestellt wurde, aber es war im Allgemeinen für SQL 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 "leicht" zu machen (d. H. Eine einzelne ALTER TABLE-Anweisung).

Ich habe mich gefragt, ob jemand eine generische SQL-Methode kennt, um so etwas mit SQLite zu tun.

278
joce

Dies wurde gerade mit 2018-09-15 (3.25.0) behoben

Der Befehl ALTER TABLE Wurde erweitert:

  • Fügen Sie die Unterstützung für das Umbenennen von Spalten in einer Tabelle mithilfe der Tabelle ALTER TABLERENAME COLUMN oldname TO newname Hinzu.
  • Korrigiert die Funktion zum Umbenennen von Tabellen, sodass auch Verweise auf die umbenannte Tabelle in Auslösern und Ansichten aktualisiert werden.

Die neue Syntax finden Sie dokumentiert unter ALTER TABLE

Die Syntax RENAME COLUMN TO Ändert den Spaltennamen der Tabelle tabellenname in neuen Spaltennamen. Der Spaltenname wird sowohl in der Tabellendefinition selbst als auch in allen Indizes, Triggern und Ansichten geändert, die auf die Spalte verweisen. Wenn die Änderung des Spaltennamens zu einer semantischen Mehrdeutigkeit in einem Trigger oder einer Ansicht führen würde, schlägt RENAME COLUMN Mit einem Fehler fehl und es werden keine Änderungen angewendet.

enter image description here Bildquelle: https://www.sqlite.org/images/syntax/alter-table-stmt.gif

Beispiel:

CREATE TABLE tab AS VALUES(1);

SELECT * FROM tab;

ALTER TABLE tab RENAME TO tab_new;

SELECT * FROM tab_new;

db-fiddle.com demo


Android-Unterstützung

Zum Zeitpunkt des Schreibens Android API 27 verwendet das SQLite-Paket Version 3.19 .

Basierend auf der aktuellen Version, die Android) verwendet und die dieses Update in Version 3.25.0 von SQLite enthält, würde ich sagen, dass Sie etwas warten müssen (ungefähr API 33), bevor Sie dies unterstützen wird zu Android hinzugefügt.

Und selbst dann, wenn Sie ältere Versionen als die API 33 unterstützen müssen, können Sie diese nicht verwenden.

41
Lukasz Szozda

Angenommen, Sie haben eine Tabelle und müssen "colb" in "col_b" umbenennen:

Zuerst benennen Sie die alte Tabelle um:

ALTER TABLE orig_table_name RENAME TO tmp_table_name;

Erstellen Sie dann die neue Tabelle basierend auf der alten Tabelle, jedoch mit dem aktualisierten Spaltennamen:

CREATE TABLE orig_table_name (
  col_a INT
, col_b INT
);

Kopieren Sie dann den Inhalt gegenüber der ursprünglichen Tabelle.

INSERT INTO orig_table_name(col_a, col_b)
SELECT col_a, colb
FROM tmp_table_name;

Lassen Sie zum Schluss den alten Tisch fallen.

DROP TABLE tmp_table_name;

Das alles in ein BEGIN TRANSACTION; und COMMIT; ist wohl auch eine gute idee.

438
Evan

Beim Stöbern fand ich dieses grafische Tool für mehrere Plattformen (Linux | Mac | Windows) namens DB-Browser für 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 Methode dafür teilen möchte, würde ich mich freuen, es zu wissen!

55
joce

Vor kurzem musste ich das in SQLite3 mit einer Tabelle namens points mit den Spalten id, lon, lat machen. Wenn die Tabelle importiert wurde, wurden die Werte für den Breitengrad fälschlicherweise in der Spalte lon und umgekehrt gespeichert. Daher ist es naheliegend, diese Spalten umzubenennen. Der Trick war also:

create table points_tmp as select id, lon as lat, lat as lon from points;
drop table points;
alter table points_tmp rename to points;

Ich hoffe das wäre nützlich für dich!

18
aizquier

Zitieren der SQLite-Dokumentation :

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.

Sie können natürlich eine neue Tabelle mit dem neuen Layout erstellen, SELECT * FROM old_table, und füllen Sie die neue Tabelle mit den Werten, die Sie erhalten.

12

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 übersichtliches Protokollfenster, in dem alle ausgeführten Befehle angezeigt werden. Wenn Sie eine Spalte über Base umbenennen, werden im Protokollfenster die folgenden Befehle angezeigt:

Base log window

Diese können dann einfach kopiert und dort eingefügt werden, wo Sie sie benötigen. Für mich ist das eine ActiveAndroid Migrationsdatei. Ein weiterer Pluspunkt ist, dass die kopierten Daten nur die SQLite-Befehle enthalten, nicht die Zeitstempel usw.

Hoffentlich spart das einigen Leuten Zeit.

7
Joshua Pinter

ändern Sie die Tabellenspalte <id> in <_id>

 String LastId = "id";

    database.execSQL("ALTER TABLE " + PhraseContract.TABLE_NAME + " RENAME TO " + PhraseContract.TABLE_NAME + "old");
    database.execSQL("CREATE TABLE " + PhraseContract.TABLE_NAME
    +"("
            + PhraseContract.COLUMN_ID + " INTEGER PRIMARY KEY,"
            + PhraseContract.COLUMN_PHRASE + " text ,"
            + PhraseContract.COLUMN_ORDER  + " text ,"
            + PhraseContract.COLUMN_FROM_A_LANG + " text"
    +")"
    );
    database.execSQL("INSERT INTO " +
            PhraseContract.TABLE_NAME + "("+ PhraseContract.COLUMN_ID +" , "+ PhraseContract.COLUMN_PHRASE + " , "+ PhraseContract.COLUMN_ORDER +" , "+ PhraseContract.COLUMN_FROM_A_LANG +")" +
            " SELECT " + LastId +" , "+ PhraseContract.COLUMN_PHRASE + " , "+ PhraseContract.COLUMN_ORDER +" , "+ PhraseContract.COLUMN_FROM_A_LANG +
            " FROM " + PhraseContract.TABLE_NAME + "old");
    database.execSQL("DROP TABLE " + PhraseContract.TABLE_NAME + "old");
3
Vahe Gharibyan

Wie bereits erwähnt, gibt es ein Tool namens SQLite Database Browser, das dies ausführt. In diesem Tool werden alle vom Benutzer oder von der Anwendung ausgeführten Vorgänge protokolliert. Wenn Sie dies einmal tun und sich das Anwendungsprotokoll ansehen, 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

2
Chris Lytridis

Erstellen Sie eine neue Spalte mit dem gewünschten Spaltennamen: COLNew.

ALTER TABLE {tableName} ADD COLUMN COLNew {type};

Kopieren Sie den Inhalt der alten Spalte COLOld in die neue Spalte COLNew.

INSERT INTO {tableName} (COLNew) SELECT {COLOld} FROM {tableName}

Hinweis: In der obigen Zeile sind Klammern erforderlich.

2
Anthony Ebert

Aus den offiziellen Unterlagen

Eine einfachere und schnellere Prozedur kann optional für einige Änderungen verwendet werden, die den Inhalt 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.

  1. Starten Sie eine Transaktion.

  2. 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.

  3. Aktivieren Sie die Schemabearbeitung mit PRAGMA writable_schema = ON.

  4. 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 die Tabelle sqlite_master wie folgt ändern, wird die Datenbank beschädigt und kann nicht gelesen werden, 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.

  5. Wenn sich die Änderung an Tabelle X auch auf andere Tabellen oder Indizes auswirkt oder Auslöser 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 sich auf diese Spalte beziehen, geändert werden.

    Achtung: Wenn Sie die Tabelle sqlite_master wie folgt ändern, wird die Datenbank beschädigt und kann nicht gelesen werden, 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.

  6. Erhöhen Sie die Versionsnummer des Schemas mit PRAGMA schema_version = X, wobei X um eins höher ist als die alte Versionsnummer des Schemas in Schritt 2 oben.

  7. Deaktivieren Sie die Schemabearbeitung mit PRAGMA writable_schema = OFF.

  8. (Optional) Führen Sie PRAGMA integrity_check aus, um sicherzustellen, dass die Schemaänderungen die Datenbank nicht beschädigt haben.

  9. Übernehmen Sie die in Schritt 1 oben gestartete Transaktion.

2
Mohammad Yahia

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, ist die Sache ganz einfach. Die folgende Abfrage würde Ihr Problem lösen:

ALTER TABLE "MyTable" RENAME COLUMN "OldColumn" TO "NewColumn";

FALL 2: SQLite ältere Versionen

Sie müssen einem anderen Ansatz folgen, um das Ergebnis zu erhalten, das möglicherweise etwas schwierig ist

Wenn Sie zum Beispiel eine Tabelle wie diese haben:

CREATE TABLE student(Name TEXT, Department TEXT, Location TEXT)

Und wenn Sie den Namen der Spalte ändern möchten, Location

Schritt 1: Benenne die Originaltabelle um:

ALTER TABLE student RENAME TO student_temp;

Schritt 2: Jetzt erstelle eine neue Tabelle student mit korrektem Spaltennamen:

CREATE TABLE student(Name TEXT, Department TEXT, Address TEXT)

Schritt 3: Kopieren Sie die Daten aus der Originaltabelle in die neue Tabelle:

INSERT INTO student(Name, Department, Address) SELECT Name, Department, Location FROM student_temp;

Hinweis: Der obige Befehl sollte aus einer einzigen Zeile bestehen.

Schritt 4: Löschen Sie die Originaltabelle:

DROP TABLE student_temp;

Mit diesen vier Schritten können Sie jede SQLite-Tabelle manuell ändern. Denken Sie daran, dass Sie auch alle Indizes, Viewer oder Trigger für die neue Tabelle neu erstellen müssen.

1
Febin Mathew

Eine Möglichkeit, wenn Sie dies zur Not tun müssen und wenn Ihre ursprüngliche Spalte mit einem Standard erstellt wurde, besteht darin, die gewünschte neue Spalte zu erstellen, den Inhalt darauf zu kopieren und die alte Spalte im Grunde "aufzugeben" (sie bleibt bestehen) vorhanden, aber Sie benutzen/aktualisieren es einfach nicht usw.)

ex:

alter table TABLE_NAME ADD COLUMN new_column_name TYPE NOT NULL DEFAULT '';
update TABLE_NAME set new_column_name = old_column_name;
update TABLE_NAME set old_column_name = ''; -- abandon old column, basically

Dies hinterlässt eine Spalte (und wenn sie mit NOT NULL, aber ohne Standard erstellt wurde, können zukünftige Einfügungen, die sie ignorieren, fehlschlagen). Wenn es sich jedoch 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.

1
rogerdpack

Seit Version 2018-09-15 (3.25.0) unterstützt sqlite das Umbenennen von Spalten

https://sqlite.org/changes.html

0
RusAlex