我通过System.Data.SQLite.dll版本1.0.90将Microsoft SQL数据库转换为SQLite。它创建表,填充它们然后添加索引。
我遇到的情况是,在一个实际上有10k条目的表上创建了一个唯一索引,该条目具有所谓的唯一值。当我尝试运行SELECT * FROM table WHERE key =我只返回一行时。当我运行SELECT键时,count(*)FROM表GROUP BY键我确实得到了正确的记录数。看看SELECT *查询的计划,我看到它使用的是唯一索引,这就是我发现问题的方法。
那么......如果索引实际上并不唯一,为什么SQLite无法创建唯一索引?
create table test (ID INT NOT NULL, ID2 INT NOT NULL);
INSERT INTO test VALUES (1, 1);
INSERT INTO test VALUES (2, 1);
CREATE UNIQUE INDEX IX_text ON [test] (ID2);
select * from test;
为什么它允许创建索引?
其他信息:我已经确认索引实际上是问题所在。我在表上定义了三个索引。
这是失败的查询。它使用所谓的唯一索引: select * from tblPPOZip,其中lobid = 68
SEARCH TABLE tblPPOZip USING INDEX IX_tblPPOZip (LOBID=?)
Trace 0 0 0 00
Goto 0 26 0 00
OpenRead 0 356 0 13 00
OpenRead 1 95127 0 k(1,B) 00
Integer 68 1 0 00
SeekGe 1 23 1 1 00
IdxGE 1 23 1 1 01
IdxRowid 1 2 0 00
Seek 0 2 0 00
Column 0 0 3 00
Column 0 1 4 00
Column 1 0 5 00
Column 0 3 6 00
Column 0 4 7 00
Column 0 5 8 00
Column 0 6 9 00
Column 0 7 10 00
Column 0 8 11 00
Column 0 9 12 00
Column 0 10 13 00
Column 0 11 14 00
Column 0 12 15 00
ResultRow 3 13 0 00
Close 0 0 0 00
Close 1 0 0 00
Halt 0 0 0 00
Transaction 0 0 0 00
VerifyCookie 0 301 0 00
TableLock 0 356 0 tblPPOZip 00
Goto 0 2 0 00
此查询通过使用+来改变索引用法: 从tbLPPOZip中选择count(*),其中+ lobid = 68
SCAN TABLE tbLPPOZip使用COVERING INDEX IX_tblPPOZip
Trace 0 0 0 00
Null 0 1 0 00
Goto 0 14 0 00
OpenRead 1 95127 0 k(1,B) 00
Rewind 1 9 2 0 00
Column 1 0 2 00
Ne 3 8 2 (BINARY) 6a
AggStep 0 0 1 count(0) 00
Next 1 5 0 01
Close 1 0 0 00
AggFinal 1 0 0 count(0) 00
Copy 1 4 0 00
ResultRow 4 1 0 00
Halt 0 0 0 00
Transaction 0 0 0 00
VerifyCookie 0 301 0 00
TableLock 0 356 0 tblPPOZip 00
Integer 68 3 0 00
Goto 0 3 0 00