Frage

Ich müsste ein paar Spalten in einigen Tabellen in einer SQLite-Datenbank umbenannt. Ich weiß, dass ein ähnliche Frage wurde auf Stackoverflow fragt vorher, aber es war für SQL im allgemeinen und der Fall von SQLite wurde nicht erwähnt.

Von der SQLite-Dokumentation für ALTER TABLE , entnehme ich, dass es nicht möglich ist, ein solches zu tun Ding "leicht" (dh eine einzelne Anweisung ALTER TABLE).

Ich frage mich jemand einen generischen SQL Weg kannte so etwas mit SQLite zu tun.

War es hilfreich?

Lösung

Dies wurde nur mit festen 2018.09.15 (3.25.0)

  

Erweiterungen des ALTER TABLE Befehl:

     
      
  • Fügen Sie Unterstützung für Spalten innerhalb einer Tabelle mit ALTER TABLE Tabelle RENAME COLUMN oldname TO newname umbenennen.
  •   
  • Fix Tabelle Feature umbenennen, damit es auch Verweise auf die umbenannte Tabelle aktualisiert in Triggern und Ansichten.
  •   

Sie können die neue Syntax finden dokumentiert unter ALTER TABLE

  

Die RENAME COLUMN TO Syntax ändert den Spaltennamen der Tabelle Tabellennamen in neuen Spaltennamen. Der Spaltenname wird geändert sowohl innerhalb der Tabellendefinition selbst und auch in allen Indizes, Trigger und Ansichten, die die Spalte verweisen. Wenn die Spalte Namensänderung in einer semantischen Mehrdeutigkeit in einem Trigger oder Ansicht führen würde, dann versagt die RENAME COLUMN mit einem Fehler und keine Änderungen angewandt werden.

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-Support

Wie des Schreibens, Android API 27 ist mit SQLite-Paket Version 3.19 .

Basierend auf der aktuellen Version, die Android verwenden wird und dass dieses Update in der Version 3.25.0 von SQLite kommt, würde ich sagen, dass Sie etwas warten müssen (ca. API 33), bevor die Unterstützung für diese wird zu Android.

Und selbst dann, wenn Sie irgendwelche Versionen unterstützen müssen älter als die API 33, Sie werden diese nicht in der Lage zu verwenden.

Andere Tipps

Angenommen, Sie haben eine Tabelle, und müssen „colb“ auf „col_b“ umbenennen:

Zuerst benennen Sie die alte Tabelle:

ALTER TABLE orig_table_name RENAME TO tmp_table_name;

Dann die neue Tabelle erstellen, auf der Grundlage der alten Tabelle, aber 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;

Schließlich fällt die alte Tabelle.

DROP TABLE tmp_table_name;

Verpackung das alles in einem BEGIN TRANSACTION; und COMMIT; ist auch wahrscheinlich eine gute Idee.

Während es wahr ist, dass es keine ALTER COLUMN ist, wenn Sie nur die Spalte umbenennen möchten, fallen die NOT NULL-Einschränkung oder den Datentyp ändern, können Sie die folgenden Befehle verwenden:

Hinweis: Diese Befehle haben das Potenzial, zu korrumpieren Ihre Datenbank, so stellen Sie sicher, dass Sie eine Sicherung

PRAGMA writable_schema = 1;
UPDATE SQLITE_MASTER SET SQL = 'CREATE TABLE BOOKS ( title TEXT NOT NULL, publication_date TEXT)' WHERE NAME = 'BOOKS';
PRAGMA writable_schema = 0;

Sie müssen entweder in der Nähe und die Verbindung wieder öffnen oder die Datenbank Vakuum, um die Änderungen in das Schema neu zu laden.

Zum Beispiel:

Y:\> sqlite3 booktest  
SQLite version 3.7.4  
Enter ".help" for instructions  
Enter SQL statements terminated with a ";"  
sqlite> create table BOOKS ( title TEXT NOT NULL, publication_date TEXT NOT NULL);  
sqlite> insert into BOOKS VALUES ("NULLTEST",null);  
Error: BOOKS.publication_date may not be NULL  
sqlite> PRAGMA writable_schema = 1; 
sqlite> UPDATE SQLITE_MASTER SET SQL = 'CREATE TABLE BOOKS ( title TEXT NOT NULL, publication_date TEXT)' WHERE NAME = 'BOOKS';  
sqlite> PRAGMA writable_schema = 0;  
sqlite> .q  

Y:\> sqlite3 booktest  
SQLite version 3.7.4  
Enter ".help" for instructions  
Enter SQL statements terminated with a ";"  
sqlite> insert into BOOKS VALUES ("NULLTEST",null);  
sqlite> .q  

Ihr Feedback FOLGEN:


Pragma writable_schema
Wenn dieses Pragma auf, so können die SQLITE_MASTER Tabellen, in denen Datenbank mit gewöhnlichen UPDATE geändert werden, INSERT und DELETE-Anweisungen. . Achtung: Missbrauch dieses Pragma leicht in einer beschädigten Datenbank-Datei führt

Tabelle ändern
SQLite unterstützt eine begrenzte Teilmenge von ALTER TABLE. Die ALTER TABLE-Befehl in SQLite ermöglicht es dem Benutzer, eine Tabelle zu benennen oder eine neue Spalte in einer vorhandenen Tabelle hinzuzufügen. Es ist nicht möglich, eine Spalte, entfernen Sie eine Spalte umbenannt, oder hinzuzufügen oder zu entfernen Einschränkungen aus einer Tabelle.

ALTER TABLE

Graben herum, fand ich diese Multi-Plattform (Linux | Mac | Windows) grafisches Tool namens DB Browser für SQLite der tatsächlich ermöglicht eine Spalt in eine sehr benutzerfreundliche Art und Weise zu benennen!

Bearbeiten | Ändern Tabelle | Wählen Sie Tabelle | Feld bearbeiten. Klick klick! Voila!

Allerdings, wenn jemand eine programmatische Art und Weise, dies zu tun teilen möchten, würde ich gerne wissen!

Vor kurzem hatte ich die in SQLite3 zu tun mit einer Tabelle mit dem Namen Punkte mit der colunms id, lon, lat . Erroneusly, wenn die Tabelle importiert wurde, wobei die Werte für die Breite in der gespeichert lon Spalte und umgekehrt, so offensichtlich, dass die fix wäre diese Spalten umzubenennen. Also der Trick war:

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, dass dies für Sie nützlich sein würde!

Zitiert die SQLite Dokumentation :

  

SQLite unterstützt eine begrenzte Teilmenge von   ALTER TABLE. Der ALTE TABLE-Befehl   in SQLite der Benutzer umbenennen können   Tabelle oder eine neue Spalte ein hinzufügen   vorhandene Tabelle. Es ist nicht möglich, ein colum umbenennen, entfernen Sie eine Spalte oder hinzuzufügen oder zu entfernen Einschränkungen aus einer Tabelle.

Was kann man natürlich tun ist, um eine neue Tabelle mit dem neuen Layout, SELECT * FROM old_table zu erstellen, und die neue Tabelle mit den Werten füllen Sie empfangen.

Zunächst einmal, das ist eines der Dinge, die mir ins Gesicht mit Überraschung ohrfeigt: Umbenennung einer Spalte erfordert eine völlig neue Tabelle erstellt und Kopieren der Daten aus der alten Tabelle in die neue Tabelle ...

Die GUI ich gelandet auf SQLite-Operationen zu tun ist, Basis . Es hat ein geschicktes Log-Fenster, die alle Befehle zeigt, die ausgeführt wurden. Doing ein Umbenennungs einer Spalte über Basis Füllt das Log-Fenster mit den notwendigen Kommandos:

Base-Log-Fenster

dann werden Diese können einfach kopiert und eingefügt, wo Sie könnten sie benötigen. Für mich, das ist in eine ActiveAndroid Migrationsdatei. Eine nette Geste, aber auch ist, dass die kopierten Daten nur die SQLite-Befehle enthalten, nicht die Zeitstempel, etc.

Wir hoffen, das spart einige Leute Zeit.

ändern Tabellenspalte bis <_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");

Wie bereits erwähnt, gibt es ein Tool SQLite Database Browser, der dies tut. Lyckily, hält dieses Tool ein Protokoll aller Operationen durch den Benutzer oder die Anwendung. Dadurch einmal und im Anwendungsprotokoll suchen, sehen Sie den Code beteiligt. Kopieren Sie die Abfrage und Paste nach Bedarf. Arbeitete für mich. Hoffe, das hilft

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

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

Kopieren Inhalt der alten Spalte COLOld neue Spalte COLNew.

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

Hinweis: Klammern sind notwendig, über die Linie.

Von der offiziellen Dokumentation

Ein einfacheres und schnelleres Verfahren kann optional für einige Änderungen verwendet werden, die nicht die On-Disk-Inhalte in irgendeiner Weise beeinträchtigen. Das folgende einfachere Verfahren ist geeignet für CHECK oder FOREIGN KEY oder NOT NULL Hemmnisse, Spalten umbenennen , oder das Hinzufügen oder Entfernen oder Ändern des Standardwert für eine Spalte.

  1. Starten Sie eine Transaktion.

  2. Ausführen PRAGMA SCHEMA_VERSION die aktuelle Schema Versionsnummer zu ermitteln. Diese Nummer wird für Schritt 6 weiter unten benötigt werden.

  3. Aktivieren Schema Bearbeitung mit PRAGMA writable_schema = ON.

  4. Führen Sie eine Update-Anweisung die Definition der Tabelle X in der sqlite_master Tabelle zu ändern: UPDATE sqlite_master SET sql = ... WHERE type = 'table' AND name = 'X';

    Achtung: wie dies für eine Änderung der sqlite_master Tabelle zu machen wird die Datenbank beschädigt und nicht lesbar machen, wenn die Änderung einen Syntaxfehler enthält. Es wird vorgeschlagen, dass eine sorgfältige Prüfung der UPDATE-Anweisung auf einem gesonderten Zuschnitt Datenbank vor getan werden sie auf einer Datenbank mit wichtigen Daten.

  5. Wenn die Änderung der Tabelle X auch andere Tabellen oder Indizes oder Trigger sind Ansichten im Schema betrifft, dann Anweisungen ausführen UPDATE auch die anderen Tabellen Indizes und Ansichten zu ändern. Wenn zum Beispiel der Name einer Spalte geändert, alle FOREIGN KEY-Einschränkungen, Trigger, Indizes und Ansichten, die auf diese Spalte verweisen muss geändert werden.

    Achtung: Noch einmal, wie diese Änderungen an der sqlite_master Tabelle macht die Datenbank beschädigt und nicht lesbar machen, wenn die Änderung einen Fehler enthält. Sorgfältig Prüfung dieses gesamten Verfahren auf einem separaten Testdatenbank, bevor es auf einer Datenbank mit wichtigen Daten und / oder erstellen Sie Sicherungskopien von wichtigen Datenbanken vor dem Ausführen dieses Verfahrens.

  6. das Schema Versionsnummer Erhöht PRAGMA SCHEMA_VERSION = X mit dem X einer mehr als die alten Schema Versionsnummer in Schritt 2 oben.

  7. gefunden ist
  8. Deaktivieren Schema Bearbeitung mit PRAGMA writable_schema = OFF.

  9. (Optional) Führen Sie PRAGMA integrity_check zu überprüfen, ob die Schemaänderungen haben die Datenbank nicht beschädigt werden.

  10. , um die Transaktion gestartet auf Schritt Commit 1 oben.

Eine Option, wenn Sie es in einer Prise getan brauchen, und wenn Ihre erste Spalte mit einem Standard erstellt wurde, ist die neue Spalte erstellen Sie mögen, kopieren Sie den Inhalt über ihn, und im Grunde „aufgeben“ die alte Säule (es bleibt vorhanden, aber Sie verwenden einfach nicht / aktualisieren, etc.)

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 Säule (und wenn es mit NOT NULL aber ohne Standard erstellt wurde, dann zukünftige Einsätze, die sie ignorieren könnten scheitern), aber wenn es nur eine Wegwerf-Tabelle ist, können die Vor- und Nachteile akzeptabel sein. Ansonsten verwenden Sie eine der anderen Antworten hier erwähnt, oder eine andere Datenbank, die umbenannten Spalten werden kann.

CASE 1: SQLite 3.25.0 +

Nur die Version 3.25.0 von SQLite unterstützt Spalten umbenannt. Wenn Ihr Gerät diese Anforderung erfüllt, sind die Dinge ganz einfach. Die folgende Abfrage würde Ihr Problem lösen:

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

CASE 2: SQLite ältere Versionen

Sie haben einen anderen Ansatz zu folgen, um das Ergebnis zu erhalten, die ein wenig schwierig sein könnte

Zum Beispiel, wenn Sie eine Tabelle wie folgt aus:

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

Und wenn Sie den Namen der Spalte Location ändern

Schritt 1: Benennen Sie die ursprüngliche Tabelle:

ALTER TABLE student RENAME TO student_temp;

Schritt 2: Sie nun eine neue Tabelle student mit korrekten Spaltennamen erstellen:

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

Schritt 3: Kopieren Sie die Daten aus der ursprünglichen Tabelle in die neue Tabelle:

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

Hinweis: Der obige Befehl sollte alle eine Zeile sein

.

Schritt 4: Löschen der ursprünglichen Tabelle:

DROP TABLE student_temp;

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

Seit Version 2018.09.15 (3.25.0) SQLite unterstützt Spalten

Umbenennen

https://sqlite.org/changes.html

sqlite3 ihredb .dump> /tmp/db.txt
bearbeiten /tmp/db.txt Spaltennamen erstellen Linie
ändern sqlite2 yourdb2 mv / move yourdb2 ihredb

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top