Ich möchte eine Spalte in der SQLite-Datenbank löschen oder hinzufügen
Ich verwende die folgende Abfrage, um die Spalte zu löschen.
ALTER TABLE TABLENAME DROP COLUMN COLUMNNAME
Aber es gibt Fehler
System.Data.SQLite.SQLiteException: SQLite error
near "DROP": syntax error
Antworten:
ALTER TABLE SQLite
Sie können:
quelle
PRAGMA foreign_keys=OFF
. In diesem Fall muss nach dieser Sequenz aufgerufenPRAGMA foreign_keys=ON
werden, um Fremdschlüssel wieder zu aktivieren.RENAME COLUMN
wird unterstützt. 🎉 sqlite.org/releaselog/3_25_0.htmlIch habe eine Java-Implementierung geschrieben, die auf der von Sqlite empfohlenen Methode basiert:
Um die Tabellenspalte zu erhalten, habe ich "PRAGMA table_info" verwendet:
Ich habe tatsächlich in meinem Blog darüber geschrieben. Weitere Erklärungen finden Sie dort:
http://udinic.wordpress.com/2012/05/09/sqlite-drop-column-support/
quelle
INSERT
Anweisung auch die neue Tabelle erstellen, indem Sie einen"CREAT TABLE" + tableName + "AS SELECT " + columnsSeperated + " FROM " + tableName + "_old;"
Wie andere darauf hingewiesen haben
Quelle: http://www.sqlite.org/lang_altertable.html
Sie können zwar immer eine neue Tabelle erstellen und dann die ältere löschen. Ich werde versuchen, diese Problemumgehung anhand eines Beispiels zu erläutern .
Jetzt möchten Sie die Spalte
height
aus dieser Tabelle entfernen .Erstellen Sie eine weitere Tabelle mit dem Namen
new_person
Kopieren Sie nun die Daten aus der alten Tabelle
Löschen Sie nun die
person
Tabelle und benennen Sie sienew_person
in umperson
Wenn Sie also eine machen
.schema
, werden Sie sehenquelle
CREATE TABLE new_person AS SELECT id, first_name, last_name, age FROM person;
http://www.sqlite.org/lang_altertable.html
Wie Sie im Diagramm sehen können, wird nur ADD COLUMN unterstützt. Es gibt jedoch eine (ziemlich schwere) Problemumgehung: http://www.sqlite.org/faq.html#q11
quelle
In SQLite 3 kann keine bestimmte Spalte gelöscht werden. Siehe FAQ .
quelle
Wie andere bereits betont haben, wird die
ALTER TABLE
Anweisung von sqlite nicht unterstütztDROP COLUMN
, und das Standardrezept dazu bewahrt keine Einschränkungen und Indizes.Hier ist ein Python-Code, um dies generisch zu tun, während alle wichtigen Einschränkungen und Indizes beibehalten werden.
Bitte sichern Sie Ihre Datenbank vor der Verwendung! Diese Funktion basiert auf der Bearbeitung der ursprünglichen CREATE TABLE-Anweisung und ist möglicherweise etwas unsicher. Beispielsweise wird sie falsch ausgeführt, wenn ein Bezeichner ein eingebettetes Komma oder eine Klammer enthält.
Wenn jemand einen besseren Weg zum Parsen von SQL einbringen möchte, wäre das großartig!
UPDATE Ich habe einen besseren Weg gefunden, um mit dem Open-Source-
sqlparse
Paketzu analysieren. Wenn es Interesse gibt, werde ich es hier posten, hinterlasse einfach einen Kommentar und frage danach ...quelle
Ich habe die @ Udinic-Antwort so umgeschrieben , dass der Code automatisch eine Abfrage zur Tabellenerstellung generiert . Es braucht auch nicht
ConnectionSource
. Dies muss auch innerhalb einer Transaktion erfolgen .quelle
Mit DB Browser for SQLite können Sie Spalten hinzufügen oder löschen.
Database StructureKlicken Sie in der Hauptansicht auf der Registerkarte auf den Tabellennamen. Eine Schaltfläche Modify Tablewird aktiviert, die ein neues Fenster öffnet, in dem Sie die Spalte / das Feld auswählen und entfernen können.
quelle
Sie können Sqlitebrowser verwenden. Im Browsermodus konnte für die jeweilige Datenbank und die Tabelle unter der Registerkarte -Datenbankstruktur nach der Option Tabelle ändern die entsprechende Spalte entfernt werden.
quelle
Ich denke, was Sie tun möchten, ist die Datenbankmigration. Das Löschen einer Spalte ist in SQLite nicht vorhanden. Sie können jedoch mithilfe der ALTER-Tabellenabfrage eine zusätzliche Spalte hinzufügen.
quelle
Sie können den SQlite Administrator zum Ändern der Spaltennamen verwenden. Klicken Sie mit der rechten Maustaste auf Tabellenname und wählen Sie Tabelle bearbeiten. Hier finden Sie die Tabellenstruktur und können sie einfach umbenennen.
quelle
Da SQLite ALTER TABLE nur eingeschränkt unterstützt, können Sie in SQLite nur die Spalte ADD am Ende der Tabelle hinzufügen ODER TABLE_NAME ÄNDERN.
Hier ist die beste Antwort auf WIE MAN SPALTE VON SQLITE LÖSCHT.
Besuchen Sie Spalte aus SQLite-Tabelle löschen
quelle
Als Alternative:
Wenn Sie eine Tabelle mit Schema haben
Sie können eine
CREATE TABLE...AS
Anweisung wie verwendenCREATE TABLE person2 AS SELECT id, first_name, last_name, age FROM person;
, dh lassen Sie die Spalten weg, die Sie nicht möchten. Löschen Sie dann die ursprünglicheperson
Tabelle und benennen Sie die neue um.Beachten Sie, dass diese Methode eine Tabelle ohne PRIMARY KEY und ohne Einschränkungen erstellt. Um diese beizubehalten, verwenden Sie die anderen beschriebenen Methoden, um eine neue Tabelle zu erstellen, oder verwenden Sie eine temporäre Tabelle als Zwischenstufe.
quelle
Diese Antwort auf eine andere Frage zielt darauf ab, eine Spalte zu ändern, aber ich glaube, ein Teil der Antwort könnte auch einen nützlichen Ansatz liefern, wenn Sie viele Spalten haben und die meisten nicht manuell für Ihre INSERT-Anweisung erneut eingeben möchten:
https://stackoverflow.com/a/10385666
Sie können Ihre Datenbank wie im obigen Link beschrieben sichern, dann die Anweisung "create table" und eine Vorlage zum Einfügen aus diesem Speicherauszug abrufen und dann den Anweisungen im SQLite-FAQ-Eintrag "Wie füge ich Spalten zu einer vorhandenen hinzu oder lösche sie?" Befolgen Tabelle in SQLite. " (FAQ ist an anderer Stelle auf dieser Seite verlinkt.)
quelle
Implementierung
Python
basierend auf Informationen unter http://www.sqlite.org/faq.html#q11 .Dieses Skript erstellt zunächst eine zufällige temporäre Tabelle und fügt nur Daten der erforderlichen Spalten ein, mit Ausnahme derjenigen, die gelöscht werden. Stellt dann die ursprüngliche Tabelle basierend auf der temporären Tabelle wieder her und löscht die temporäre Tabelle.
quelle
Meine Lösung muss nur diese Methode aufrufen.
Und Hilfsmethode, um die Spalten zu erhalten:
quelle
Ich habe die Antwort von user2638929 verbessert und jetzt können Spaltentyp , Primärschlüssel, Standardwert usw. beibehalten werden.
PS. Ich habe es hier verwendet
android.arch.persistence.db.SupportSQLiteDatabase
, aber Sie können es einfach für die Verwendung ändernandroid.database.sqlite.SQLiteDatabase
quelle
und rufen Sie einfach eine Methode auf
quelle
Beispiel zum Hinzufügen einer Spalte: -
hier Schüler ist table_name und TOB ist Spalten_Name hinzugefügt werden.
Es funktioniert und getestet.
quelle
Sie können jetzt auch den DB-Browser für SQLite verwenden, um Spalten zu bearbeiten
quelle