根据DBI文档的说明,似乎只能通过
我该如何使用
do
方法获取受影响行数。$rows_affected = $dbh->do("UPDATE your_table SET foo = foo + 1");
我该如何使用
prepare
/execute
得到相同的结果?prepare
返回 undef。DBI 文档对此确实没有详细说明,但它们给出了示例 $sth = $dbh->prepare($statement) or die $dbh->errstr;
,这暗示了这一点。 - e.dan如果您的查询是非SELECT类型(例如UPDATE或DELETE),那么您可以利用rows属性:
my $query = "..."; # your query
my $sth = $dbh->prepare($query);
$sth->execute();
print "Number of rows affected: " . $sth->rows . "\n";
rows返回上次查询所影响的行数,如果出现错误则返回-1。但是需要注意的是,对于SELECT语句,不能依赖于rows。
需要注意的是,对于非SELECT查询,execute也会返回所影响的行数。然而,如果没有受到任何影响,则execute返回"0E0"(无论如何,Perl都应该将其视为0)。
my $query = "..."; # your query
my $sth = $dbh->prepare($query);
my $numrows = $sth->execute();
print "Number of rows affected: " . $numrows . "\n";
my $query = "SELECT COUNT(*) AS rows FROM ... WHERE ...";
my $numrows = $dbh->selectrow_array($query, undef);
print "Number of rows: " . $numrows . "\n";
my $query = "SELECT COUNT(*) AS rows FROM ... WHERE ...";
my $numrows = $dbh->selectall_arrayref($query, { Slice => {} });
print "Number of rows: " . @$numrows[0]->{rows} . "\n";
正如user153275所说:
“这似乎不再正确,至少在4.007版本中。
Execute返回匹配行数而非受影响行数。”
我在此链接中找到了一个有用的解决方案,添加where子句AND (columnName <> newValue)
:
https://www.perlmonks.org/?node_id=1141381
这样,查询将仅查找要更改的行。