我有一个非常大的SQLite3数据库,如下所示:
我在上面显示的4列中创建了一个索引:
QUOTE_DATE,EXPIRATION,STRIKE,OPTION_TYPE。
为此,我运行了CREATE INDEX DEST_INDEX ON DATA(QUOTE_DATE,EXPIRATION,STRIKE,OPTION_TYPE);
。
我的印象是索引将作为新列添加到我的表中。并且我将能够在for循环中使用此索引遍历我的数据库。我错了。
问题:
我想通过像SELECT * FROM DATA WHERE INDEX=i
这样的查询来遍历我的数据库(例如在SQL之外,在Matlab中)。但是我创建的索引没有明确可用。
问题:
是否可以创建一个显式索引作为模仿我使用CREATE INDEX
创建的列的列?
是否可以使用索引进行查询,但不对每个不同的列使用WHERE
?有更好的解决方案吗?
感谢您的帮助!
答案 0 :(得分:1)
基于您不必扩展/更新新表的事实,您可以简单地跳过执行触发器,而不必担心更改插入数据的内容。
所以你可以创建一个新版本的表," idata"。
然后检查结果,如果您愿意,请删除旧表并重命名新表
(我不提供代码,因为我不想成为杀死你的数据库的代码的作者。;-)它似乎很古老,可能不容易替换。)
我为你的问题制作了自己的MCVE,它就在答案的最后 请考虑为您的下一个SQLite问题提供一个。
注意:
您可能只想使用表" idxdata"。它仅由" data"中的非冗余条目组成。这样可以节省大量空间,特别是如果"数据"真的和你说的一样大。
在这种情况下,你应该删除"临时"关键词。并且根本不使用create table idata
中的代码。
create temporary table idxdata
( QUOTE_DATE date,
EXPIRATION date,
STRIKE int,
OPTION_TYPE CHAR(1),
idx integer primary key
);
insert into idxdata
select distinct
QUOTE_DATE,
EXPIRATION,
STRIKE,
OPTION_TYPE,
NULL
from data;
" idxdata"的内容:
2012-01-03|2012-01-06|1000|C|1
2012-01-04|2012-01-07|1000|C|2
2012-01-04|2012-01-07|1000|B|3
2012-02-04|2012-02-07|1000|B|4
更多用于将数据扩展到idata的代码,附加了idx列:
create table idata
( QUOTE_DATE date,
EXPIRATION date,
STRIKE int,
OPTION_TYPE CHAR(1),
idx integer);
insert into idata
select *
from data
join idxdata
using (QUOTE_DATE, EXPIRATION, STRIKE, OPTION_TYPE);
select * from idata;
输出:
QUOTE_DATE EXPIRATION STRIKE OPTION_TYPE idx
---------- ---------- ---------- ----------- ----------
2012-01-03 2012-01-06 1000 C 1
2012-01-03 2012-01-06 1000 C 1
2012-01-03 2012-01-06 1000 C 1
2012-01-03 2012-01-06 1000 C 1
2012-01-04 2012-01-07 1000 C 2
2012-01-04 2012-01-07 1000 C 2
2012-01-04 2012-01-07 1000 C 2
2012-01-04 2012-01-07 1000 B 3
2012-01-04 2012-01-07 1000 B 3
2012-02-04 2012-02-07 1000 B 4
2012-02-04 2012-02-07 1000 B 4
2012-02-04 2012-02-07 1000 B 4
MCVE基金会:
CREATE TABLE data(QUOTE_DATE date, EXPIRATION date, STRIKE int, OPTION_TYPE CHAR(1));
INSERT INTO data(QUOTE_DATE,EXPIRATION,STRIKE,OPTION_TYPE) VALUES('2012-01-03','2012-01-06',1000,'C');
INSERT INTO data(QUOTE_DATE,EXPIRATION,STRIKE,OPTION_TYPE) VALUES('2012-01-03','2012-01-06',1000,'C');
INSERT INTO data(QUOTE_DATE,EXPIRATION,STRIKE,OPTION_TYPE) VALUES('2012-01-03','2012-01-06',1000,'C');
INSERT INTO data(QUOTE_DATE,EXPIRATION,STRIKE,OPTION_TYPE) VALUES('2012-01-03','2012-01-06',1000,'C');
INSERT INTO data(QUOTE_DATE,EXPIRATION,STRIKE,OPTION_TYPE) VALUES('2012-01-04','2012-01-07',1000,'C');
INSERT INTO data(QUOTE_DATE,EXPIRATION,STRIKE,OPTION_TYPE) VALUES('2012-01-04','2012-01-07',1000,'C');
INSERT INTO data(QUOTE_DATE,EXPIRATION,STRIKE,OPTION_TYPE) VALUES('2012-01-04','2012-01-07',1000,'C');
INSERT INTO data(QUOTE_DATE,EXPIRATION,STRIKE,OPTION_TYPE) VALUES('2012-01-04','2012-01-07',1000,'B');
INSERT INTO data(QUOTE_DATE,EXPIRATION,STRIKE,OPTION_TYPE) VALUES('2012-01-04','2012-01-07',1000,'B');
INSERT INTO data(QUOTE_DATE,EXPIRATION,STRIKE,OPTION_TYPE) VALUES('2012-02-04','2012-02-07',1000,'B');
INSERT INTO data(QUOTE_DATE,EXPIRATION,STRIKE,OPTION_TYPE) VALUES('2012-02-04','2012-02-07',1000,'B');
INSERT INTO data(QUOTE_DATE,EXPIRATION,STRIKE,OPTION_TYPE) VALUES('2012-02-04','2012-02-07',1000,'B');
使用:SQLite 3.18.0 2017-03-28