在SQLite中的索引中创建显式索引列

时间:2017-08-25 17:14:21

标签: indexing sqlite

我有一个非常大的SQLite3数据库,如下所示:

enter image description here

我在上面显示的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?有更好的解决方案吗?

感谢您的帮助!

1 个答案:

答案 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