2009-09-21 57 views
0

假設我在sqlite3的表上的索引排序:的SQLite3:編程確定列是否按升序或降序排列

CREATE TABLE Person (id integer primary key, firstName varchar(20), lastName varchar(20), address varchar(200)); 
CREATE INDEX IX_Person ON Person (lastName ASC, firstName ASC); 

我可以發現哪些列在索引中是這樣的:

sqlite> pragma index_info('ix_person'); 
0|2|lastName 
1|1|firstName 

但是這並不能告訴我排序的列是按照升序還是降序排列。

有沒有方法可以在不重新解析CREATE INDEX語句的情況下以編程方式確定?

+0

我在努力想到一個簡單的問題 - 你有一個用例嗎? – 2009-09-21 10:52:26

+0

@Mike Woodhouse,我想在模式管理工具中執行此操作,而不是在主應用程序中執行此操作。我創建了一組相關表,其中一個表中的索引必須在另一個表中複製(帶有附加列)。 – finnw 2009-09-21 12:40:00

回答

2

「沒有重新解析CREATE INDEX語句」這真的很難;但從sqlite_master表中獲取CREATE INDEX sql代碼並進行輕量級解析看起來相當容易。

因爲你可以從你已經確定了PRAGMA列名,所有你需要做的是記號化是SQL,並檢查令牌(S)立即跟隨(在CREATE INDEX SQL代碼)的令牌是列名稱。

將有可能COLLATE somecollation(你應該也可能記錄,因爲什麼整理是在使用非常重要的畢竟),也有可能這兩個可選的令牌後,第二天一會ASC, DESC或別的東西(意味着在SQL中沒有指定順序)。 ((順便說一下,你無疑也需要關於索引是否唯一的信息 - 你可以通過解析得到的信息,或者可能更好,在桌子上的「PRAGMA index_list」),我想象你'已經在做無論如何獲取索引名稱))。

我不認爲你應該對索引文件是否考慮排序(較新的「降序文件」格式)或不依據(傳統格式)做出假設 - 這取決於PRAGMA legacy_file_format ...並查詢它你將爲新數據庫發生什麼,而不是當前數據庫發生了什麼。所以,從模式中忠實地記錄訂購信息似乎是一種更爲穩健的策略。

+0

我沒有考慮整理。感謝您指出了這一點。 – finnw 2009-10-12 18:18:01

+0

@finnw,不客氣! – 2009-10-13 02:13:30

1

我不認爲排序在概念上與索引有關。 AFAIK它是ANSI-SQL的一部分,但大多數RDBMS(如Oracle)都忽略了它。

這似乎是舊版本的SQLite的情況下,以及(從SQLite的文檔):

每個列名可以跟隨的「ASC」或「DESC」關鍵字來指示一個排序。取決於數據庫文件格式,排序順序可能會也可能不會被忽略。 「傳統」文件格式會忽略索引排序順序。

至少根據文檔,index-info pragma不能幫助您確定索引內的排序順序。所以看起來好像你運氣不好......

+0

看起來這對於多列索引會產生很大的影響。 – recursive 2009-10-06 19:51:16

+0

如果肯定會被忽略,那麼總是將它視爲ASC將是一個可接受的解決方案。 – finnw 2009-10-06 23:00:39

+0

對於多列索引,索引內列的順序很重要,但我看不到排序順序有很大影響。我想到一個索引就像一棵平衡良好的樹,所以asc和desc之間的差別可能會左轉或右轉,但它不應該影響樹的深度。 – Thorsten 2009-10-07 04:59:09