2013-12-13 13 views
7

Dường như nó không đơn giản đối với reordering columns trong một sqlite3 table. Ít nhất số sqlite manager trong firefox không hỗ trợ tính năng này. Ví dụ, di chuyển cột 2 đến cột3 và di chuyển cột 5 sang cột2. Có cách nào để sắp xếp lại các cột trong bảng sqlite, hoặc với một phần mềm quản lý sqlite hoặc một kịch bản? Cảm ơn.Sqlite3: cách sắp xếp lại các cột trong bảng?

Trả lời

18

Đây không phải là một nhiệm vụ tầm thường trong bất kỳ DBMS nào. Bạn gần như chắc chắn sẽ phải tạo một bảng mới với thứ tự mà bạn muốn, và di chuyển dữ liệu của bạn từ một bảng đến thứ tự. Không có câu lệnh bảng thay đổi để sắp xếp lại các cột, do đó, trong trình quản lý sqlite hoặc bất kỳ nơi nào khác, bạn sẽ không tìm thấy cách thực hiện điều này trong cùng một bảng.

Nếu bạn thực sự muốn thay đổi thứ tự, bạn có thể làm:

Giả sử bạn có tableA:

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

Bạn có thể tạo một TableB với các cột được sắp xếp theo cách bạn muốn:

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

Sau đó di chuyển dữ liệu sang bảngB từ bảngA:

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

Sau đó, loại bỏ các tableA gốc và đổi tên TableB để TableA:

DROP table tableA; 
ALTER TABLE tableB RENAME TO tableA; 

sqlfiddle demo

+0

Đối với lệnh chèn vào tabelB ở trên, nó có giữ id không? Chúng ta cần bản ghi trong bảng mới có cùng id như trong bảng A. – user938363

+0

Chắc chắn. nếu một trong các cột đó là id, nó sẽ được di chuyển sang bảng mới. –

+1

@FilipeSilva Nếu cột ID được đặt thành AUTOINCREMENT thì sao? – pavitran

7

Bạn luôn có thể đặt hàng các cột tuy nhiên bạn muốn trong câu lệnh SELECT của bạn, như thế này:

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

Bạn không nên cần phải "đặt hàng" chúng trong bảng riêng của mình.

+0

Cần phải khớp lược đồ của 2 bảng để dữ liệu có thể được sao chép từ cái này sang cái khác. Nhập khẩu Sqlite3 không khớp với cột khi sao chép. Vì vậy, chúng tôi kết thúc với cột số nguyên dưới cột văn bản chẳng hạn. – user938363

2

Thứ tự sqlite3 không thành vấn đề. Về mặt khái niệm, không nên, nhưng hãy thử thử nghiệm này để chứng minh rằng nó có:

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

Điền bảng với khoảng 20.000 bản ghi có hình thu nhỏ là jpeg nhỏ. Sau đó làm một vài thắc mắc như thế này:

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

Không quan trọng bao nhiêu hồ sơ được trả về, trên máy tính của tôi, truy vấn đầu tiên mất khoảng 0m0.008s và truy vấn thứ hai mất 0m0.942s. Sự khác biệt lớn, và lý do là vì Blob; filesize là trước Blob và basiccanstatus là sau.

Bây giờ chúng tôi đã chuyển Blob vào bảng riêng của nó và ứng dụng của chúng tôi rất vui.

+1

Điều này rất thú vị, mặc dù nó không trả lời câu hỏi. – sapht

+0

Đúng. Câu trả lời của Filipe Silva trả lời câu hỏi.Câu trả lời của tôi là nhiều hơn về lý do tại sao điều này cần phải được thực hiện, tức là xác nhận câu hỏi. Chúng tôi đã phải làm điều đó, và không có một cách tầm thường nào để thay đổi thứ tự, vì vậy chúng tôi đã tạo ra một bảng thứ hai và đặt cột chậm trong bảng đó. Điều này tạo ra sự khác biệt lớn về hiệu suất cho chúng tôi. – user8353681

Các vấn đề liên quan