#c# #asp.net #mysql
#c# #asp.net #mysql
Вопрос:
У меня есть форма, в которой есть несколько полей, каждое из которых должно быть уникальным само по себе. каков наилучший способ выполнить этот запрос?
Должен ли я открыть одно соединение и один mySqlAdapter и сделать:
myDataAdapter.Fill(myDataSet, "table");
для каждого значения (каждый раз изменяя sql-запрос) или есть более оптимизированный способ сделать это
Заранее спасибо
Дорон Синай
Ответ №1:
Звучит как необычное требование. Если бы вы могли подробнее рассказать о специфике, лучшее решение могло бы предложить само себя.
Учитывая то, что вы сказали, я понимаю, что вам нужно знать, существует ли уже введенное значение любого из нескольких полей ввода в вашей форме в «таблице».
Представляются два варианта:
1) Запросить базу данных
Что-то вроде
SELECT column1, column2 FROM table WHERE column1='value1' OR column2='value2'
Если вы не получили обратно ни одной строки, все значения были уникальными (обратите внимание, что другой пользователь приложения мог ввести те же значения сразу после выбора … решение этого вопроса является предметом другого вопроса, если вам нужна помощь там).
Если вы получите строки обратно, значения в возвращенных строках расскажут вам, что уже присутствовало в БД.
2) Заставьте базу данных обеспечить уникальность
Создайте уникальный индекс для каждого столбца, который должен быть уникальным. Обратите внимание, что размещение большого количества индексов в базе данных может значительно снизить производительность вставок и обновлений и потребляет дисковое пространство.
Обратите внимание, что вариант 1 может оказаться слишком медленным (в зависимости от размера вашей базы данных и аппаратного обеспечения) без указания индекса в полях, которые должны быть уникальными.
Комментарии:
1. Спасибо за ваш совет, я думаю, что я буду придерживаться подхода принудительной уникальности, поскольку у меня не так много данных
Ответ №2:
В дополнение к параметрам, указанным Эриком, я представлю еще один вариант. Вы можете загрузить все существующие значения, используя один вызов базы данных. Вероятно, вы хотите загрузить уникальные значения в HashSet по соображениям производительности. Затем сверьте значения формы с HashSet и убедитесь, что эти значения еще не существуют в HashSet.
Вот в чем дело. Вам нужно учитывать, о каком объеме данных вы здесь говорите. Если данные должны быть уникальными во всей таблице базы данных, вы, вероятно, захотите использовать ограничение уникальности, предложенное Эриком. Вы не хотите проблем с масштабируемостью в будущем, используя подход, о котором я упоминал выше, или создавая потенциально неэффективный SQL-запрос, о котором также упоминал Эрик.
Правильный ответ зависит от структуры и объема данных, для которых вам необходимо обеспечить уникальность.