2013-12-13 15 views
7

Es scheint, dass es für reordering columns in einem sqlite3 table nicht einfach ist. Zumindest die sqlite manager in firefox unterstützt diese Funktion nicht. Verschieben Sie beispielsweise column2 in column3 und verschieben Sie column5 in column2. Gibt es eine Möglichkeit, Spalten in der SQLite-Tabelle neu anzuordnen, entweder mit einer SQLite-Verwaltungssoftware oder einem Skript? Vielen Dank.Sqlite3: Wie man Spalten in einer Tabelle neu anordnet?

Antwort

18

Dies ist keine einfache Aufgabe in einem DBMS. Sie müssten fast sicher eine neue Tabelle mit der gewünschten Reihenfolge erstellen und Ihre Daten von einer Tabelle in die Reihenfolge verschieben. Es gibt keine alter table-Anweisung, um die Spalten neu anzuordnen. Daher werden Sie entweder in sqlite manager oder an einem anderen Ort keine Möglichkeit finden, dies in der gleichen Tabelle zu tun.

Wenn Sie wirklich die Reihenfolge ändern möchten, können Sie tun:

Sie haben tableA Unter der Annahme:

create table tableA(
col1 int, 
col3 int, 
col2 int); 

Sie eine tableB schaffen könnten mit den Spalten, wie Sie wollen nach:

create table tableB(
col1 int, 
col2 int, 
col3 int); 

dann die Daten zu tableB von tableA bewegen:

insert into tableB 
SELECT col1,col2,col3 
FROM tableA; 

Dann die ursprüngliche tableA entfernen und tableB zu TableA umbenennen:

DROP table tableA; 
ALTER TABLE tableB RENAME TO tableA; 

sqlfiddle demo

+0

Für den Befehl der Einfügung in TabelleB oben behält es die ID? Wir brauchen den Datensatz in der neuen Tabelle mit der gleichen ID wie in Tabelle A. – user938363

+0

Sicher. Wenn eine dieser Spalten die ID ist, wird sie in die neue Tabelle migriert. –

+1

@FilipeSilva Was ist, wenn die ID-Spalte auf AUTOINCREMENT gesetzt ist? – pavitran

7

Sie können jederzeit bestellen Sie die Spalten aber Sie in Ihrer SELECT-Anweisung wollen, wie folgt aus:

SELECT column1,column5,column2,column3,column4 
FROM mytable 
WHERE ... 

Sie sollten nicht sie selbst in der Tabelle „Ordnung“ benötigen.

+0

Muss Schema von 2 Tabellen übereinstimmen, damit die Daten von einem zu einem anderen kopiert werden können. Sqlite3-Import stimmt beim Kopieren nicht mit der Spalte überein. Also enden wir zum Beispiel mit der Integer-Spalte unter der Textspalte. – user938363

2

Die Reihenfolge, in sqlite3 Sache tut. Konzeptionell sollte es nicht, aber versuchen, dieses Experiment zu beweisen, dass es funktioniert:

CREATE TABLE SomeItems (identifier INTEGER PRIMARY KEY NOT NULL, filename TEXT NOT NULL, path TEXT NOT NULL, filesize INTEGER NOT NULL, thumbnail BLOB, pickedStatus INTEGER NOT NULL, deepScanStatus INTEGER NOT NULL, basicScanStatus INTEGER NOT NULL, frameQuanta INTEGER, tcFlag INTEGER, frameStart INTEGER, creationTime INTEGER); 

die Tabelle Bestücken mit etwa 20.000 Datensätze, bei denen eine kleine Thumbnail JPEG ist. Dann machen Sie ein paar Abfragen wie folgt:

time sqlite3 Catalog.db 'select count(*) from SomeItems where filesize = 2;' 
time sqlite3 Catalog.db 'select count(*) from SomeItems where basicscanstatus = 2;' 

Es spielt keine Rolle, wie viele Datensätze zurückgegeben werden, auf meinem Rechner, die erste Abfrage dauert etwa 0m0.008s und die zweite Abfrage dauert 0m0.942s. Massiver Unterschied, und der Grund ist wegen des Blobs; Dateigröße ist bevor der Blob und basicscanstatus danach ist.

Wir haben jetzt den Blob in seine eigene Tabelle verschoben, und unsere App ist glücklich.

+1

Das ist sehr interessant, obwohl es die Frage überhaupt nicht beantwortet. – sapht

+0

Wahr. Filipe Silvas Antwort beantwortet die Frage.Meine Antwort war mehr darüber, warum dies getan werden muss, d. H. Validiert die Frage. Wir mussten es tun, und es gab keine einfache Möglichkeit, die Reihenfolge zu ändern, also erstellten wir eine zweite Tabelle und setzten die langsame Spalte in diese Tabelle. Dies machte einen großen Unterschied in der Leistung für uns. – user8353681

Verwandte Themen