2013-12-13 4 views
7

sqlite3 tablereordering columnsでは直感的ではないようです。少なくともsqlite managerfirefox)はこの機能をサポートしていません。たとえば、column2をcolumn3に移動し、column5をcolumn2に移動します。 sqlite管理ソフトウェアまたはスクリプトを使用して、sqliteテーブルの列を並べ替える方法はありますか?ありがとう。Sqlite3:テーブルの列を並べ替える方法は?

答えて

18

これは、どのDBMSでも簡単な作業ではありません。ほとんどの場合、必要な順序で新しいテーブルを作成し、あるテーブルからそのオーダーにデータを移動する必要があります。カラムを並べ替えるためのalter table文はないので、sqliteマネージャや他の場所では、同じテーブル内でこれを行う方法が見つかりません。

あなたが本当に順序を変更したい場合は、あなたができる:あなたがにtableAを持っていると仮定すると

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

あなたが列を持つテーブルBを作成することができますあなたが望むように並べ替え

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

その後にtableAからTABLEBにデータを移動:

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

は、その後、元にtableAを削除し、TableAのにTableBの名前を変更:sqlite3の中

DROP table tableA; 
ALTER TABLE tableB RENAME TO tableA; 

sqlfiddle demo

+0

上記のtabelBに挿入するコマンドについては、idも保持していますか? tableAと同じIDを持つ新しいテーブルにレコードが必要です。 – user938363

+0

それらの列の1つがIDであれば、新しい表に移行されます。 –

+1

@FilipeSilva ID列がAUTOINCREMENTに設定されている場合はどうなりますか? – pavitran

7

あなたのSELECT文でしたいしかし、あなたは常にこのよう、列を注文することができます。

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

あなたがテーブル自体に「注文」、それらをする必要はありません。

+0

2つのテーブルのスキーマを一致させる必要があります。これにより、データを別のテーブルにコピーすることができます。 Sqlite3インポートは、コピー時に列と一致しません。ですから、たとえば、テキスト列の下に整数列があります。 – user938363

2

順序が問題を行います。概念的には、それはないはずですが、それがないことを証明するために、この実験を試してみてください。

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

は、サムネイルが小さいJPEGで約20,000レコードを持つテーブルを移入します。そして、このようなクエリのいくつか:

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

が返されたレコードの数は問題ではありません、私のマシン上で、最初のクエリが0m0.008s程度かかり、2番目のクエリは0m0.942sをとります。大きな違いは、その理由はBlobのためです。ファイルサイズはBlobの前であり、basicscanstatusは後です。

これでBlobを独自のテーブルに移動しました。私たちのアプリは満足しています。

+1

これは非常に興味深いですが、それは全く質問に答えません。 – sapht

+0

真。 Filipe Silvaの答えはその質問に答えます。私の答えはなぜこれを行う必要があるか、すなわち質問を検証するためのものでした。私たちはそれを実行しなければならず、順序を変更するための些細な方法もなかったので、2番目のテーブルを作成し、遅い列をそのテーブルに配置しました。これは私たちの業績に大きな違いをもたらしました。 – user8353681

関連する問題