假设我在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 :(得分:2)
“没有重新解析CREATE INDEX语句”这真的很难;但是从sqlite_master
表中获取CREATE INDEX sql代码并进行轻量级解析似乎相当容易。
由于您可以从已经识别的PRAGMA
中获取列名,因此您需要做的就是 tokenize 该SQL并立即检查令牌(在CREATE INDEX sql code)作为列名的标记。
可能会COLLATE somecollation
(您可能也应该记录,因为正在使用的排序规则 毕竟非常重要),并且可能在这两个可选标记之后,下一个将是ASC,DESC或其他东西(意味着SQL中没有指定顺序)。
((顺便说一下,你肯定也想知道关于索引是否是唯一的信息 - 你可以通过解析,或者可能更好,通过桌面上的“PRAGMA index_list”获得的信息,我想你是无论如何都已经做了索引名称))。
我认为您不应该假设索引文件是否考虑了排序(较新的“降序文件”格式)或不考虑(遗留格式) - 这取决于PRAGMA legacy_file_format
...和查询它会告诉您新数据库会发生什么,而不是当前数据库发生了什么。因此,忠实地记录模式中的订购信息对我来说似乎是一个更强大的策略。
答案 1 :(得分:1)
我不认为排序顺序在概念上与索引有任何关系。 AFAIK是ANSI-SQL的一部分,但大多数RDBMS(如Oracle)都忽略了它。
对于旧版本的SQLite,似乎也是如此(来自SQLite文档):
每个列名后面都可以跟一个“ASC”或“DESC”关键字来表示排序顺序。根据数据库文件格式,可能会也可能不会忽略排序顺序。 “遗留”文件格式忽略索引排序顺序。
至少根据文档,index-info pragma无法帮助您确定索引中的排序顺序。所以看起来好像你运气不好......