Я пишу программу, которая восстанавливает структурированные данные как отдельные записи из (поврежденного) файла и собирает результаты в базу данных sqlite.Как предотвратить добавление идентичных записей в базу данных SQL
Программа вызывается несколько раз с немного отличающимися параметрами восстановления. Это приводит к тому, что часто восстанавливаются одни и те же, но иногда разные данные из файла.
Теперь, каждый раз, когда я запускаю свою программу с разными параметрами, она должна добавлять только новые (разные) найденные элементы в одну и ту же базу данных.
Это означает, что мне нужен быстрый способ определить, присутствует ли каждая восстановленная запись в БД или нет, чтобы добавить их, только если они еще не существуют в БД.
Я понимаю, что для каждой записи, которую я хочу добавить, я мог бы сначала сделать SELECT для всех столбцов, чтобы увидеть, есть ли соответствующая запись в БД и только добавить новую, если она не найдена.
Но поскольку я добавляю 10000 записей, выполнение SELECT для каждой из этих записей кажется довольно неэффективным (медленным) для меня.
Интересно, есть ли более умный способ справиться с этим? I.e, есть ли способ сказать sqlite, что я не хочу дублировать записи, и поэтому он автоматически обнаруживает и отклоняет их? Я знаю об модификаторе UNIQUE, но это не так, потому что это относится только к одиночным столбцам, не так ли? Мне нужно было бы сказать, что комбинация COL1 + COL2 + COL3 должна быть уникальной. Есть ли способ сделать это?
Примечание: я никогда не хочу обновлять существующие записи. Я только хочу собрать набор разных записей.
Bonus часть - производительность
В классическом языке программирования, я хотел бы использовать словарь ключ-значение, где ключ является суммой всех значений записи, то. Аналогично, я мог бы рассчитать хэш-код для каждой добавленной записи и сначала посмотреть на этот хэш-код. Если нет совпадения, тогда запись, конечно же, не находится в БД; Если есть совпадение, мне все равно придется искать в БД любые дубликаты. Это наверняка будет быстрее, но мне все еще интересно, может ли sqlite сделать это более эффективным.
Как насчет производительности?Будет ли он просто искать все элементы отдельно или использовать какой-нибудь более умный (более быстрый) алгоритм, например. как использовать хеш, чтобы ускорить это? –
Также UNIQUE с несколькими столбцами: [Для каждого ограничения UNIQUE в таблице каждая строка должна иметь уникальную комбинацию значений в столбцах, идентифицированных ограничением UNIQUE.] (Http://www.sqlite.org/lang_createtable.html) – danihp
@ThomasTempelmann для поиска это вопрос, если у вас есть указатель на этот столбец, вы можете ускорить поиск наверняка ... – aleroot