Задача
Вы хотите узнать, сколько строк было обработано запросом.
Решение
Некоторые API предоставляют счетчик в виде значения, возвращаемого функцией, выдающей запрос. В других имеется отдельная функция, вызываемая после выполнения запроса.
Обсуждение
Для запросов, обрабатывающих строки (UPDATE, DELETE, INSERT, REPLACE), каждый API предоставляет возможность определить количество строк, подвергшихся соответствующему изменению. В MySQL «обработанный» обычно означает «измененный», поэтому те строки, которые запрос не изменяет, не учитываются, даже если они соответствуют условиям, указанным в запросе.
Например, для приведенного ниже предложения UPDATE количество «обработанных» строк будет равно 0, потому что оно не изменяет текущие значения столбцов (вне зависимости от того, сколько строк удовлетворяют условию инструкции WHERE):
UPDATE limbs SET arms = 0 WHERE arms = 0;
Perl
В сценариях, основанных на DBI, количество строк, измененных запросом, возвращает функция do() или execute(), в зависимости от того, как выполняется запрос:
# выполнить $query, используя do()
my $count = $dbh->do ($query);
# вывести 0 строк в случае ошибки
printf "%d rows were affected\n", (defined ($count) ? $count : 0);
# выполнить запрос, используя prepare() и execute()
my $sth = $dbh->prepare ($query);
my $count = $sth->execute ();
printf "%d rows were affected\n", (defined ($count) ? $count : 0);
При использовании DBI вы можете указать MySQL на необходимость вывода количества строк, соответствующих условиям запроса, а не измененных им. Для этого укажите mysql_client_found_rows=1 в части опций имени источника данных, передаваемого в качестве аргумента при вызове connect() для соединения с сервером MySQL, например:
my $dsn =
"DBI:mysql:cookbook:localhost;mysql_client_found_rows=1";
my $dbh = DBI->connect ($dsn, "cbuser", "cbpass", { PrintError => 0, RaiseError => 1 });
mysql_client_found_rows изменяет способ подсчета строк на время соединения.
PHP
В PHP для получения количества строк, измененных запросом, вызовите функцию mysql_affected_rows():
$result_id = mysql_query ($query, $conn_id);# вернуть 0 строк, если запрос вызвал ошибку
$count = ($result_id ? mysql_affected_rows ($conn_id) : 0);
print ("$count rows were affected\n");
Аргументом mysql_affected_rows() является идентификатор соединения. Если не указать аргумент, используется текущее соединение.
Python
В DB-API для Python счетчик строк доступен в виде значения атрибута rowcount курсора запроса:
cursor = conn.cursor ()
cursor.execute (query)
print "%d rows were affected" % cursor.rowcount
Java
Интерфейс Java JDBC предоставляет два способа подсчета количества строк в зависимости от метода, вызванного для выполнения запроса. Если используется executeUpdate(), то он возвращает непосредственно количество строк:
Statement s = conn.createStatement ();
int count = s.executeUpdate (query);
s.close ();
System.out.println (count + " rows were affected");
Если же вы применяете метод execute(), то он возвращает «истину» или «ложь». Значения показывают, генерирует ли предложение результирующее множество. Для предложений, не возвращающих результат, таких как UPDATE и DELETE, можно получить количество строк, обработанных ими, при помощи метода getUpdateCount():
Statement s = conn.createStatement ();
if (!s.execute (query))
{
// нет результирующего множества, вывести счетчик строк
System.out.println (s.getUpdateCount () + " rows were affected");
}
s.close ();
Для предложений, изменяющих строки, драйвер MySQL Connector/J JDBC обеспечивает подсчет количества строк, удовлетворяющих условиям запроса, а не измененных запросом.