2013-12-13 13 views
7

sqlite3 table numaralı telefondan reordering columns için bu kolay değil gibi görünüyor. En az firefox numaralı telefondan sqlite manager bu özelliği desteklemiyor. Örneğin, sütun 2'yi sütun3'e taşıyın ve sütun5'i sütun2'ye taşıyın. Bir sqlite yönetim yazılımı veya bir komut dosyasıyla sqlite tablosundaki sütunları yeniden sıralamak için bir yol var mı? Teşekkürler. Eğer SELECT deyiminde istediğiniz ancakSqlite3: bir tablodaki sütunları yeniden sıralamak nasıl?

cevap

18

Bu, herhangi bir DBMS'de önemsiz bir görev değildir. İstediğiniz sırayla yeni bir tablo oluşturmak ve verilerinizi bir tablodan siparişe taşımak zorunda kalacaksınız. Sütunları yeniden sıralamak için bir tablo ifadesi yoktur, bu nedenle sqlite yöneticisi veya başka bir yerde, bunu aynı tabloda yapmanın bir yolunu bulamazsınız. Gerçekten sırasını değiştirmek istiyorsanız

, bunu yapabilirsiniz:

Eğer tableA var varsayarsak:

: sütunlar istediğiniz şekilde sıralanmış olan bir TABLEB yaratabilecek

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

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

sonra tableA TABLEB veri taşımak:

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

Sonra orijinal tableA kaldırıp TABLEB TABLEA için yeniden adlandırın: sqlite3 içinde

DROP table tableA; 
ALTER TABLE tableB RENAME TO tableA; 

sqlfiddle demo

+0

Yukarıdaki tabelB'ye ekleme komutu için, kimliği de korur mu? Tabloda olduğu gibi aynı kimliğe sahip yeni bir tabloya ihtiyacımız var. – user938363

+0

Elbette. Bu sütunlardan biri id ise, yeni tabloya taşınacaktır. –

+1

@FilipeSilva Kimlik sütunu AUTOINCREMENT olarak ayarlanmışsa ne olur? – pavitran

7

Bunu, sütunları her zaman sipariş edebilirsiniz:

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

Sen gerekmez tabloda kendisinde "düzen" onları etmek.

+0

Verilerin birinden diğerine kopyalanabilmesi için 2 tablo şemasının eşleştirilmesi gerekir. Sqlite3 içe aktarma, kopyalama sırasında sütuna uymuyor. Yani, örneğin sütun sütununda tamsayı sütunuyla sonuçlanırız. – user938363

2

sipariş önemi var. Kavramsal olarak, bu olmamalı, ama öyle olduğunu kanıtlamak için bu denemeyi:

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

küçük küçük jpeg yaklaşık 20.000 kayıtlarıyla tabloyu doldurun. Sonra böyle sorgularının birkaç yapın:

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

döndürülür kaç kaydın önemli değil, benim makinede, birinci sorgu 0m0.008s sürer ve ikinci sorgu 0m0.942s sürer. Büyük fark ve nedeni Blob'un sebebi; dosyalama Blob ve basicscanstatus sonradır.

Artık Bloğu kendi masasına taşıdık ve uygulamamız mutlu.

+1

Bu, tüm soruya cevap vermese de çok ilginç. – sapht

+0

Doğru. Filipe Silva'nın cevabı soruya cevap veriyor.Cevabım, bunun neden yapılması gerektiği konusunda daha fazlaydı, yani soruyu doğrular. Bunu yapmak zorundaydık ve düzeni değiştirmek için önemsiz bir yol yoktu, bu yüzden ikinci bir tablo oluşturduk ve bu tablodaki yavaş sütunu oluşturduk. Bu bizim için performans açısından büyük bir fark yarattı. – user8353681

İlgili konular