On ne peut pas faire précisément ce que vous demandez, mais contrairement à certains SGBDR, SQLite est capable d'exécuter des DDL à l'intérieur d'une transaction, avec le résultat approprié. Cela signifie que si vous êtes vraiment préoccupé par le fait que rien ne verra jamais file_hash_list sans index, vous pouvez faire ce qui suit
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;
ou l'équivalent en utilisant les primitives de transaction de la bibliothèque de base de données que vous avez.
Je ne suis pas sûr de savoir comment nécessaire Mais ce n'est pas vraiment le cas, comparé à l'exécution de ces deux commandes en dehors d'une transaction.
Comme d'autres l'ont souligné, les index de SQLite sont tous des B-trees ; vous n'avez pas à choisir le type ou la portion de la colonne qui est indexée ; la totalité de la ou des colonnes indexées sont dans l'index. Il sera toujours efficace pour les requêtes de plage, il pourrait juste prendre un peu plus d'espace disque que vous ne le souhaitez.