Предполагая, что я делаю что-то вроде следующего:
my $rows = $dbh->do("UPDATE MYTABLE SET amount=1200 WHERE id =123");
$rows
возвращает 1, даже если количество уже равно 1200. Таким образом, это считается обновленной строкой.
Мой вопрос: есть ли способ проверить, действительно ли обновление изменило значения в строке, помимо выполнения запроса перед обновлением?
Измените запрос SQL на:
UPDATE MYTABLE SET amount=1200 WHERE id = 123 AND amount <> 1200
Таблица будет идентичной, но возвращает число строк, которые фактически изменились.
По умолчанию DBD:: mysql возвращает количество строк, сопоставленных в UPDATE
, а не число физически измененных строк. Вы можете изменить это поведение, отключив mysql_client_found_rows
в своем обращении к connect
:
my $dsn = "DBI:mysql:;mysql_client_found_rows=0";
my $dbh = DBI->connect($dsn, $user, $password);
Twinkles
ответ правильный, но вы должны создать дескриптор оператора с помощью prepare
, а затем execute
большинство запросов к базе данных.
В этом случае вы напишете
my $update_if_changed = $dbh->prepare('UPDATE mytable SET amount = ? WHERE id = ? AND amount != ?')
и впоследствии
$update_if_changed->execute($amount, $id, $amount)
UPDATE
и количество фактически измененных строк. Вам просто нужно указать, какое значение сообщать, что вы можете сделать с помощьюmysql_client_found_rows
в DBD :: mysql.