В чем разница между этими двумя способами реализации «приращения при дублировании»? - PullRequest
0 голосов
/ 22 марта 2011

Предположим, у меня есть таблица user_count, определенная следующим образом:

   id          primary key, auto increment
   user_id     unique
   count       default 0

Я хочу увеличить count на единицу, если существует существующая запись пользователя, или вставить новую запись.

В настоящее время я делаю это так (в Python):

   try:
      cursor.execute("INSERT INTO user_count (user_id) VALUES (%s)", user.id)
   except IntegrityError:
      cursor.execute("UPDATE user_count SET count = count+1 WHERE user_id = %s", user.id)

И это также может быть реализовано следующим образом:

cursor.execute("INSERT INTO user_count (user_id) VALUES (user_id) ON DUPLICATE KEY UPDATE count = count + 1", user.id)

В чем разница между этими двумя способами, и какой из них лучше?

Ответы [ 2 ]

1 голос
/ 22 марта 2011

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

Она будет использоваться, поскольку она должна быть быстрее и надежнее.

Первый вариант - запасной вариант, если эта функция недоступна (более старая версия базы данных?).

1 голос
/ 22 марта 2011

Первый использует исключение для управления потоком программы, а это не то, что вам следует делать, если у вас нет других решений (например, получение эксклюзивного доступа к файлу). Кроме того, он берет на себя работу из базы данных, которая должна знать лучше для обработки дела.

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

Я бы использовал второе решение, поскольку база данных обычно лучше вас знает, как обращаться с делом.

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