Можно ли использовать исключения для отметки при попытке вставки дубликата SQL? - PullRequest
0 голосов
/ 15 декабря 2018

Сценарий

У меня есть база данных, в которой есть две таблицы EQUAL с разными именами (назовем их Table1 и Table2).Table1 периодически отправляет кучу данных в Table2 через программу на C #.Некоторые из этих данных уже находятся в Таблице 2, поэтому в cmd появляется простое Исключение, и программа продолжается.Я не хочу повторных данных, так что это нормально, и программа работает именно так, как я хочу.

Мой вопрос

Мне было интересно, все ли в порядкечто функция запроса C # должна была обрабатывать так много исключений, как в этом случае (20% вставок дублируются и идут к исключению).Поскольку, хотя программа работает, функция может быть неэффективной или «вредной» (каким-то неизвестным образом, например, вызывая больше задержек) для самой программы.

Если это так, как я могу решить эту проблему с помощью простогоЗапрос «INSERT INTO»?Есть ли какая-нибудь команда, которая сделает это «хорошим способом сделать это»?

Ответы [ 3 ]

0 голосов
/ 15 декабря 2018

Поскольку вы в MySql , вы можете завершить все операторы без ошибок, используя этот синтаксис

INSERT INTO T1 (a, b)
    SELECT a, b FROM T2
ON DUPLICATE KEY UPDATE b = c;

Если вы зададите предложение ON DUPLICATE KEY UPDATE и строкувставка приведет к дублированию значения в УНИКАЛЬНОМ индексе или ПЕРВИЧНОМ КЛЮЧЕ, произойдет ОБНОВЛЕНИЕ старой строки.

См. это

0 голосов
/ 17 декабря 2018

Для тех, кто не может использовать команду UPDATE в DUPLICATE.Я хочу отметить, что существует команда IGNORE.Что используется следующим образом:

INSERT IGNORE INTO table (param1, ...) VALUES (value1, ...)

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

  • UPDATE использует команду SELECT.
0 голосов
/ 15 декабря 2018

Исключения используются для определения поведения, которое в противном случае является неожиданным;«исключительное» поведение.Проще подумать, если исходить из того, что они по своей сути плохие, а скорее указывают на непреднамеренное поведение.

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

Однако есть и альтернативы.Например, вы можете реструктурировать свое приложение, чтобы попытаться вставить запись только в том случае, если дубликат не существует.Я не уверен, как выглядит ваше приложение, поэтому я не уверен, используете ли вы фреймворк, облегчающий реализацию или нет.Пользователь eocron упомянул, что команда MERGE может быть ближе к нужной вам функциональности.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...