Как я могу проверить, изменились ли значения после обновления?

4

Предполагая, что я делаю что-то вроде следующего:

my $rows = $dbh->do("UPDATE MYTABLE SET amount=1200 WHERE id =123"); 

$rows возвращает 1, даже если количество уже равно 1200. Таким образом, это считается обновленной строкой.
Мой вопрос: есть ли способ проверить, действительно ли обновление изменило значения в строке, помимо выполнения запроса перед обновлением?

Теги:
sql-update

3 ответа

8

Измените запрос SQL на:

UPDATE MYTABLE SET amount=1200 WHERE id = 123 AND amount <> 1200

Таблица будет идентичной, но возвращает число строк, которые фактически изменились.

  • 0
    Нет необходимости изменять запрос, поскольку MySQL уже отслеживает как количество строк, сопоставленных в UPDATE и количество фактически измененных строк. Вам просто нужно указать, какое значение сообщать, что вы можете сделать с помощью mysql_client_found_rows в DBD :: mysql.
  • 0
    Да, но мое решение имеет то преимущество, что оно не зависит от поставщика.
1

По умолчанию DBD:: mysql возвращает количество строк, сопоставленных в UPDATE, а не число физически измененных строк. Вы можете изменить это поведение, отключив mysql_client_found_rows в своем обращении к connect:

my $dsn = "DBI:mysql:;mysql_client_found_rows=0";
my $dbh = DBI->connect($dsn, $user, $password);
1

Twinkles ответ правильный, но вы должны создать дескриптор оператора с помощью prepare, а затем execute большинство запросов к базе данных.

В этом случае вы напишете

my $update_if_changed = $dbh->prepare('UPDATE mytable SET amount = ? WHERE id = ? AND amount != ?')

и впоследствии

$update_if_changed->execute($amount, $id, $amount)

Ещё вопросы

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