【问题标题】:SQLite3: programatically determine whether a column is sorted in ascending or descending orderSQLite3:以编程方式确定列是按升序还是降序排序
【发布时间】:2009-09-21 10:24:34
【问题描述】:

假设我在 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 语句的情况下以编程方式确定这一点?

【问题讨论】:

  • 我很难想出一个重要的情况 - 你有用例吗?
  • @Mike Woodhouse,我想在模式管理工具中执行此操作,而不是在主应用程序中。我正在创建一组相关表,其中一个表中的索引必须在另一个表中复制(带有额外的列)。

标签: sql sqlite indexing


【解决方案1】:

“不重新解析 CREATE INDEX 语句”真的很难;但是从sqlite_master 表中获取 CREATE INDEX sql 代码并进行轻量级解析似乎相当容易。

由于您可以从您已经确定的 PRAGMA 中获取列名,您需要做的就是 tokenize 该 SQL 并立即检查令牌(在 CREATE INDEX 中) sql 代码)作为列名的标记。

可能会有COLLATE somecollation(您可能还应该记录它,因为使用的排序规则毕竟非常重要),并且可能在这两个可选标记之后,非常下一个将是 ASC、DESC 或其他(意味着 SQL 中没有指定顺序)。

((顺便说一句,您无疑还需要有关索引是否唯一的信息-您可以通过解析获得该信息,或者可能更好的是,在表格上使用“PRAGMA index_list”,我想您会这样”无论如何,我已经在做获取索引名称))。

我认为您不应该假设索引文件是否考虑排序(较新的“降序文件”格式)或不考虑排序(旧格式)——这取决于PRAGMA legacy_file_format ...并查询它告诉您新数据库会发生什么,而不是当前数据库会发生什么。因此,对我来说,忠实地记录模式中的排序信息似乎是一个更强大的策略。

【讨论】:

  • 我没有考虑整理。感谢您指出这一点。
【解决方案2】:

我认为排序顺序在概念上与索引没有任何关系。 AFAIK 它是 ANSI-SQL 的一部分,但大多数 RDBMS(如 Oracle)大多忽略它。

旧版本的 SQLite 似乎也是如此(来自 SQLite 文档):

每个列名后面可以跟一个“ASC”或“DESC”关键字来指示排序顺序。排序顺序可能会或可能不会被忽略,具体取决于数据库文件格式。 “旧”文件格式忽略索引排序顺序。

至少根据文档,index-info pragma 不能帮助您确定索引中的排序顺序。所以看起来你运气不好......

【讨论】:

  • 似乎对多列索引会有很大的影响。
  • 如果它肯定会被忽略,那么始终将其视为 ASC 将是一个可接受的解决方案。
  • 对于多列索引,索引中列的顺序很重要,但我看不出排序顺序有多大影响。我认为索引就像一棵平衡良好的树,所以 asc 和 desc 之间的区别是向左还是向右“转”,但它不应该影响树的深度。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-25
  • 2019-11-12
  • 2011-08-25
  • 1970-01-01
  • 1970-01-01
  • 2015-10-04
  • 2014-02-19
相关资源
最近更新 更多