为什么在存在非唯一值时可以创建唯一的SQLite索引?

时间:2014-03-19 17:00:30

标签: sql sqlite system.data.sqlite

我通过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  

0 个答案:

没有答案