假设我做了类似以下的事情:
my $rows = $dbh->do("UPDATE MYTABLE SET amount=1200 WHERE id =123");
即使金额已经 1200,$rows
也会返回1.因此,它被视为更新的行。
我的问题是:除了在更新之前进行查询之外,有没有办法检查更新是否实际更改了行中的值?
答案 0 :(得分:9)
将SQL查询更改为:
UPDATE MYTABLE SET amount=1200 WHERE id = 123 AND amount <> 1200
该表将是相同的,但它返回实际更改的行数。
答案 1 :(得分: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)
答案 2 :(得分:1)
默认情况下,DBD::mysql会返回UPDATE
中匹配的行数,而不是物理更改的行数。您可以通过在connect
:
mysql_client_found_rows
来更改此行为
my $dsn = "DBI:mysql:;mysql_client_found_rows=0";
my $dbh = DBI->connect($dsn, $user, $password);