2010-07-05 82 views
1

我正在使用SQLite。我想創建一個與現有表格數據不同的新表格。我已經嘗試了以下內容,但它在Mozzilla SQLite管理工具或SQLite Manager中不起作用。我究竟做錯了什麼?重新複製並重新排序表

INSERT INTO temp (SnippetID, LibraryID,Name, BeforeSelection, AfterSelection, ReplaceSelection, NewDocument, NewDocumentLang, Sort) 
          SELECT (SnippetID, LibraryID,Name, BeforeSelection, AfterSelection, ReplaceSelection, NewDocument, NewDocumentLang, Sort) 
          FROM Snippets ORDER BY LibraryID; 

謝謝 - JZ

回答

7

我給你的問題很簡單: 「爲什麼?」。 SQL是一種關係代數,數據集只有在抽取中指定時纔有序。

由於您的數據庫可以自由地強加它喜歡的任何順序,因此討論數據的順序是沒有意義的。任何像樣的數據庫都不會在乎插入記錄的順序,而只關心可用於有效存儲和檢索數據的鍵和約束以及其他屬性。

僅當您使用select ... order by提取數據時,順序必須修復。如果您希望能夠有效地提取您的LibraryID列所排序的數據,只需將其索引並在提取數據時使用order by子句。

+0

「任何像樣的數據庫都不會在意插入記錄的順序」..對於InnoDB來說並不嚴格,因爲數據以PRIMARY KEY順序存儲。如果沒有定義,InnoDB將使用內部主鍵。以隨機順序插入表格會導致長期碎片化。 – innvo 2011-06-15 16:28:15

1

默認情況下,該表對主鍵或表中的第一列「排序」,無論如何這通常是主鍵。當你做

select * from mytable 

它使用這個默認的「訂單」。儘管Pax說的一切都是真的,我對它也是+1。