Определение количества строк, обработанных запросом

Задача
Вы хотите узнать, сколько строк было обработано запросом.

Решение
Некоторые 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 обеспечивает подсчет количества строк, удовлетворяющих условиям запроса, а не измененных запросом.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела MySQL на эту тему:
Вывод списков таблиц и баз данных
Мониторинг сервера MySQL
Определение наличия или отсутствия результирующего множества
Определение текущего пользователя MySQL
Определение текущей базы данных