【发布时间】:2014-04-15 01:53:03
【问题描述】:
假设我执行以下操作:
my $rows = $dbh->do("UPDATE MYTABLE SET amount=1200 WHERE id =123");
$rows 返回 1,即使金额已经为 1200。因此它被视为更新的行。
我的问题是:除了在更新之前进行查询之外,有没有办法检查更新是否真的改变了一行中的值?
【问题讨论】:
标签: mysql sql perl sql-update
假设我执行以下操作:
my $rows = $dbh->do("UPDATE MYTABLE SET amount=1200 WHERE id =123");
$rows 返回 1,即使金额已经为 1200。因此它被视为更新的行。
我的问题是:除了在更新之前进行查询之外,有没有办法检查更新是否真的改变了一行中的值?
【问题讨论】:
标签: mysql sql perl sql-update
默认情况下,DBD::mysql 返回UPDATE 中匹配的行数,而不是物理更改的行数。您可以通过在调用 connect 时禁用 mysql_client_found_rows 来更改此行为:
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)
【讨论】:
将 SQL 查询更改为:
UPDATE MYTABLE SET amount=1200 WHERE id = 123 AND amount <> 1200
该表将是相同的,但它返回实际更改的行数。
【讨论】:
UPDATE 中匹配的行数和实际更改的行数。您只需要告诉它要报告哪个值,您可以使用 DBD::mysql 中的mysql_client_found_rows 来完成。