Как получить много записей таблицы базы данных по первичному ключу?

0

Используя ADO.NET MySQL Connector, что является хорошим способом получить множество записей (1000+) с помощью первичного ключа?

У меня есть таблица с несколькими небольшими столбцами и первичный ключ VARCHAR (128). В настоящее время он имеет около 100 тыс. Записей, но в будущем это станет больше.

В начале я подумал, что буду использовать инструкцию SQL IN:

SELECT * FROM `table` WHERE `id` IN ('key1', 'key2', [...], 'key1000')

Но с этим запрос может быть очень длинным, а также мне придется вручную избегать символов кавычек в ключах и т.д.

Теперь я использую таблицу MySQL MEMORY (tempid INT, id VARCHAR (128)), чтобы сначала загрузить все ключи с подготовленными инструкциями INSERT. Затем я делаю соединение, чтобы выбрать все существующие ключи, после чего я очищаю беспорядок в таблице памяти.

Есть ли лучший способ сделать это?

Примечание. Возможно, это не лучшая идея иметь строку в качестве первичного ключа, но вопрос будет таким же, если столбец VARCHAR будет нормальным индексом.

Временная таблица. До сих пор кажется, что решение заключается в том, чтобы поместить данные во временную таблицу, а затем в JOIN, что в основном является тем, что я сейчас делаю (см. выше).

  • 0
    Как вы получаете список ключей для вашего запроса?
  • 3
    Не слишком ли поздно переосмыслить свой ПЕРВИЧНЫЙ КЛЮЧ - VARCHAR (128) не является предпочтительным вариантом для любого уровня воображения, особенно если, как вы говорите, не ключевые столбцы маленькие.
Показать ещё 3 комментария
Теги:
select
ado.net
primary-key

4 ответа

0
Лучший ответ

Я столкнулся с аналогичной ситуацией в системе расчета заработной платы, где пользователю необходимо было создавать отчеты на основе выбора сотрудников (например, сотрудников X,Y,Z... или сотрудников, работающих в определенных офисах). Я создал окно фильтра со всеми сотрудниками и всеми атрибутами, которые можно было бы рассматривать как критерии фильтра, и чтобы это окно сохраняло выбранный идентификатор сотрудника в таблице фильтров из базы данных. Я сделал это, потому что:

  • Генерация SELECT запросов с динамически созданным фильтром IN является просто уродливым и крайне непрактичным.
  • Я мог бы присоединиться к этой таблице во всех моих запросах, которые должны были использовать окно фильтра.

Не может быть лучшим решением там, но подано, и все равно мне очень хорошо.

  • 0
    Спасибо, полезно знать, что кто-то придумал подобное решение и доволен :-)
  • 0
    Отмечено как ответ, так как это был самый полезный ответ
0

Почему вы не можете использовать параметр Table value, чтобы нажимать клавиши в форме DataTable и возвращать соответствующие записи?

или

Просто вы пишете частный метод, который может конкатенировать все коды ключей из предоставленной коллекции и возвращать одну строку и передать эту строку в запрос.

Я думаю, это может решить вашу проблему.

  • 0
    Конкатенация строк подразумевает, что я не могу использовать MySQLParameters для помещения ключей в запрос. Это означает, что я должен сам избежать их, что может создать угрозу безопасности и проблемы с кодировкой символов. К сожалению, я также имею дело с не-ASCII символами.
  • 0
    О, вы используете MySQL? Извините, я думал, что вы используете сервер Microsoft SQL.
0

Если вас беспокоит производительность, я определенно не рекомендую предложение "IN". Гораздо лучше попробуйте сделать INNER JOIN, если сможете.

Вы можете сначала вставить все значения во временную таблицу и присоединиться к ней или выполнить подвыбор. Лучше всего на самом деле профилировать изменения и выяснить, что лучше всего подходит для вас.

  • 0
    Короткий EXPLAIN SELECT показывает, что MySQL может использовать индекс первичного ключа при выборе с помощью предложения «IN». Как вы используете LEFT JOIN, когда данные отсутствуют в базе данных, а только в самом запросе select?
  • 0
    Как видите, это именно то, чем я сейчас занимаюсь. Положить их в таблицу памяти и затем присоединиться.
0

Если ваши первичные ключи следуют некоторым шаблонам, вы можете выбрать, где ключ, как "abc%".

Если вы хотите выйти из 1000 за раз, в какой-то последовательности, вы можете захотеть иметь другой столбец int в таблице данных с кластеризованным индексом. Это будет выполнять ту же работу, что и текущая таблица памяти, - позволяет вам выбирать по диапазону int.

Какова природа первичного ключа? Это что-то значимое?

  • 0
    Нет, ключи являются совершенно случайными строками в этом отношении (это идентификаторы сообщений электронной почты)

Ещё вопросы

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