2013-12-13 15 views
7

Wygląda na to, że nie jest to łatwe dla reordering columns w sqlite3 table. Przynajmniej sqlite manager w firefox nie obsługuje tej funkcji. Na przykład przenieś kolumnę2 na kolumnę3 i przenieś kolumnę5 na kolumnę2. Czy istnieje sposób, aby zmienić kolejność kolumn w tabeli sqlite, za pomocą oprogramowania do zarządzania sqlite lub skryptu? Dzięki.Sqlite3: jak zmienić kolejność kolumn w tabeli?

Odpowiedz

18

To nie jest trywialne zadanie w każdym DBMS. Niemal na pewno trzeba będzie utworzyć nową tabelę z żądaną kolejnością i przenieść dane z jednej tabeli do zamówienia. Nie ma instrukcji zmiany tabeli, aby zmienić kolejność kolumn, więc albo w menedżerze sqlite, albo w innym miejscu, nie znajdziesz sposobu na zrobienie tego w tej samej tabeli.

Jeśli naprawdę chcesz zmienić kolejność, można zrobić:

Zakładając masz TABLEA:

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

Można by stworzyć tableB z kolumny klasyfikowane tak, jak chcesz:

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

Następnie przenieść dane do tableB z TABLEA:

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

Następnie wyjąć oryginalny TABLEA i zmienić tableB do TableA:

DROP table tableA; 
ALTER TABLE tableB RENAME TO tableA; 

sqlfiddle demo

+0

Dla polecenia wstawienia do powyższej tabeliB, czy zachowuje również identyfikator? Potrzebujemy rekordu w nowej tabeli o tym samym identyfikatorze, co w tabeli A. – user938363

+0

Pewnie. jeśli jedna z tych kolumn jest identyfikatorem, zostanie przeniesiona do nowej tabeli. –

+1

@FilipeSilva Co się stanie, jeśli kolumna ID jest ustawiona na AUTOINCREMENT? – pavitran

7

Zawsze można zamówić kolumn jednak chcesz w SELECT, tak:

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

Nie ma potrzeby „zamówienie” je w samej tabeli.

+0

Konieczność dopasowania schematu 2 tabel, aby dane mogły być kopiowane między sobą. Import Sqlite3 nie pasuje do kolumny podczas kopiowania. Tak więc na przykład kończymy kolumną całkowitą w kolumnie tekstowej. – user938363

2

Kolejność sqlite3 ma znaczenie. Koncepcyjnie, to nie powinno, ale spróbuj tego eksperymentu, aby udowodnić, że robi:

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); 

wypełnić tabelę z około 20.000 rekordów, gdzie miniatur jest niewielka jpeg. Następnie zrobić kilka zapytań tak:

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

Nieważne ile rekordy są zwracane na moim komputerze, pierwsze zapytanie trwa około 0m0.008s i drugie zapytanie trwa 0m0.942s. Ogromna różnica, a przyczyną jest Blob; filesize jest przed Blobem, a podstawa jest po nim.

Teraz przenieśliśmy Blob do własnego stołu, a nasza aplikacja jest szczęśliwa.

+1

Jest to bardzo interesujące, choć w ogóle nie odpowiada na pytanie. – sapht

+0

Prawda. Odpowiedź Filipe Silvy odpowiada na pytanie.Moja odpowiedź była bardziej o tym, dlaczego to musi być zrobione, tj. Sprawdza poprawność pytania. Musieliśmy to zrobić i nie było trywialnego sposobu na zmianę kolejności, więc stworzyliśmy drugą tabelę i wstawiliśmy wolną kolumnę do tego stołu. Zrobiło to dla nas ogromną różnicę w wydajności. – user8353681

Powiązane problemy