使用SQLite如何索引CREATE TABLE语句中的列?

我如何索引CREATE TABLE语句中的列? 桌子看起来像

command.CommandText = "CREATE TABLE if not exists file_hash_list( " + "id INTEGER PRIMARY KEY, " + "hash BLOB NOT NULL, " + "filesize INTEGER NOT NULL);"; command.ExecuteNonQuery(); 

我希望文件大小是索引,并希望它是4个字节

你不能精确地做你正在问的东西,但是与一些RDBMSs不同,SQLite能够在一个事务中执行DDL,并得到合适的结果。 这意味着如果你真的关心什么都没有看到没有索引的file_hash_list,你可以做

 BEGIN; CREATE TABLE file_hash_list ( id INTEGER PRIMARY KEY, hash BLOB NOT NULL, filesize INTEGER NOT NULL ); CREATE INDEX file_hash_list_filesize_idx ON file_hash_list (filesize); COMMIT; 

或使用任何数据库库的事务原语的等价物。

我不确定这是多么的必要 ,相比之下,只是在交易之外做两个命令。

正如其他人所指出的,SQLite的索引都是B树, 你不能selecttypes是什么或列的哪一部分被索引; 整个索引列在索引中。 对于范围查询它仍然是有效的,它可能会占用比你真正喜欢的更多的磁盘空间。

我不认为你可以。 为什么你不能使用第二个查询? 在SQLite中指定索引的大小似乎是不可能的。 但是再次,这是SQ_Lite_;)

 create index myIndex on myTable (myColumn) 

编辑:我留下了这个非常糟糕的想法 ,以显示什么应该做的解决scheme(因为它绝对不会工作)。

只要将filesize INTEGER NOT NULLreplace为filesize INTEGER NOT NULL filesize INTEGER UNIQUE NOT NULL 。 唯一的关键字将创build索引。

您也可以执行一个单独的CREATE INDEX命令。

正如Matt Wolfe指出的那样,如果你这样做,你会声明文件大小是独一无二的……这是一个非常糟糕的主意,因为显然两个不同的文件可以有相同的大小。 当然这很愚蠢,显然不是OP想要的。