按照DBI文档,看来我只能通过do
方法获得受影响的行数。
$rows_affected = $dbh->do("UPDATE your_table SET foo = foo + 1");
我怎样才能得到同样的结果,如果我用prepare
/ execute
?
大约从execute
method in DBI的文档:
对于非“SELECT”语句,“执行”返回受影响,如果知道的行数。如果没有行受到影响,然后“执行”返回“0E0”,这Perl会当作0,但将视为真。请注意,这是不是一个错误的任何行通过声明的影响。如果不知道受影响的行数,则“执行”返回-1。
如果您的查询是一个非选择一个(例如UPDATE或DELETE),那么你可以利用rows的:
my $query = "..."; # your query
my $sth = $dbh->prepare($query);
$sth->execute();
print "Number of rows affected: " . $sth->rows . "\n";
行返回受上一查询或-1错误的情况下的行数。然而,在设计上,你可以不依赖于行的SELECT语句。
需要注意的是,对于非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";
相反,如果你的查询是一个SELECT,那么你可以不依赖于行。
但是,您可以执行:
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版本。 执行将返回匹配的行,受影响的行不数数“。
我发现这个链接有用的解决方案,将在where子句AND (columnName <> newValue)
:
https://www.perlmonks.org/?node_id=1141381
这样,查询就会发现只有改变行。