@neil 简要提到了 SQLite Pragma statements PRAGMA INDEX_LIST['table_name'] 和 PRAGMA INDEX_INFO['index_name']。根据文档,这些既作为 SQLite 命令存在,也可以在函数中使用(即 pragma_index_list(table_name) 和 pragma_index_info(index_name)。
为了更好地理解这一点,让我们看一下下面的 SQL:
CREATE TABLE Assets
(
Asset_Id INTEGER NOT NULL,
Longitude REAL NOT NULL,
Latitude REAL NOT NULL,
Name TEXT NOT NULL,
Installation REAL NOT NULL,
Constraint PK_Assets PRIMARY KEY (Asset_Id)
);
CREATE INDEX IX_Assets_Coordinate On Assets (Longitude, Latitude);
CREATE INDEX IX_Assets_Name On Assets (Name);
以下 SQLite 会话演示了如何查询索引:
.mode csv
sqlite> PRAGMA index_list('Assets');
seq,name,unique
0,IX_Assets_Name,0
1,IX_Assets_Coordinate,0
sqlite> PRAGMA index_info('IX_Assets_Name');
seqno,cid,name
0,3,Name
sqlite> PRAGMA index_info('IX_Assets_Coordinate');
seqno,cid,name
0,1,Longitude
1,2,Latitude
sqlite>
有趣的是PRAGMA 命令可以像SELECT 语句一样使用,所以在C# 中运行这些命令没有问题。
在SQLite Pragma statements 中,他们有一个有趣的示例 SQL 语句,用于枚举所有表的所有索引列:
SELECT DISTINCT m.name || '.' || ii.name AS 'indexed-columns'
FROM sqlite_master AS m,
pragma_index_list(m.name) AS il,
pragma_index_info(il.name) AS ii
WHERE m.type = 'table'
ORDER BY 1;