Используя SQLite, как мне индексировать столбцы в операторе CREATE TABLE?

55

Как индексировать столбец в моей инструкции 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();

Я хочу, чтобы indexize был индексом и хотел бы, чтобы он был 4 байта

Теги:

3 ответа

109

Вы не можете делать то, что вы просите, но в отличие от некоторых РСУБД, SQLite может выполнять DDL внутри транзакции с соответствующим результатом. Это означает, что если вы действительно обеспокоены тем, что когда-либо видели файл_файла без индекса, вы можете сделать

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-деревья; вы не можете выбрать, что такое тип или какая часть столбца индексируется; весь индексированный столбец (столбцы) находятся в индексе. Он будет по-прежнему эффективен для запросов диапазона, он просто может занимать немного больше места на диске, чем вам бы хотелось.

  • 1
    Отличный ответ.
  • 0
    Что может произойти, если вместо этого используются два отдельных запроса?
Показать ещё 2 комментария
4

Я не думаю, что ты можешь. Почему вы не можете использовать второй запрос? И указание размера индекса, по-видимому, невозможно в SQLite. Но опять же, это SQ_Lite_;)

create index
    myIndex
on
    myTable (myColumn)
  • 0
    Слово «уникальный» не требуется, и, судя по первоначальному вопросу, оно, вероятно, тоже не требуется.
  • 0
    Правильно! Не знаю, откуда это.
-8

РЕДАКТИРОВАТЬ: Я оставил эту ОЧЕНЬ НЕОБХОДИМАЯ ИДЕЯ, чтобы показать, что не следует делать как решение (потому что это определенно не сработает).

Просто замените filesize INTEGER NOT NULL на filesize INTEGER UNIQUE NOT NULL. Уникальное ключевое слово создаст индекс.

Вы также можете выполнить отдельную команду CREATE INDEX.

Как сказал Мэтт Вулф, если вы это сделаете, вы бы объявили, что размер файла будет уникальным... Это действительно очень плохая идея, так как очевидно, что два разных файла могут иметь одинаковый размер. Конечно, это глупо и явно не то, что хочет OP.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню