ROW_COUNT()

ROW_COUNT() 返回最近执行的 SQL 语句的 affected-row 状态:DML 语句返回受影响行数,结果集和失败语句返回 -1,DDL 使用语句特定的计数规则。

描述

ROW_COUNT() 报告当前会话中上一条语句的 affected-row 状态:

  • 对于 INSERTUPDATEDELETEREPLACE 等 DML 语句,返回受影响的行数。

  • SELECT 等结果集语句或失败语句之后,返回 -1;它不报告结果集包含的行数。

  • 大多数 DDL 语句返回 0,但部分语句返回该语句特定的影响行数。例如,CREATE TABLE ... AS SELECT 返回插入的行数。DROP DATABASE 返回删除的 catalog relation/对象数量,包括表、视图和序列;表上的索引不会额外增加计数。

其他 affected-row 规则如下:

语句

返回状态

插入新行的 REPLACE

1

替换冲突行的 REPLACE

2(删除加插入)

普通 UPDATE

计算匹配行,包括被赋为原值、数据实际未变化的行。这与 MySQL 默认计算 changed rows 不同;MySQL 只有在客户端启用 CLIENT_FOUND_ROWS 时才计算 matched rows。

INSERT ... ON DUPLICATE KEY UPDATE

插入返回 1,实际修改行的更新返回 2,无实际变化的更新返回 0

CALL

传播存储过程最终产生的非负 affected-row 计数。如果存储过程的最后一条语句返回结果集,后续 ROW_COUNT() 返回 0

预处理的 SELECT ROW_COUNT()

EXECUTE 时读取状态,而不是在 PREPARE 时固定状态

该值反映的是紧邻的前一条语句,因此连续第二次执行 SELECT ROW_COUNT() 会返回 -1,因为它的前一条语句是上一次的 SELECT

语法

ROW_COUNT()

返回值

返回整数形式的 affected-row 状态。结果集语句或失败语句之后返回 -1。DDL 通常返回 0,但 CREATE TABLE ... AS SELECT 会返回插入行数,DROP DATABASE 会返回删除的 catalog relation 数量。

参数释义

ROW_COUNT() 不接受任何参数。它以空函数调用形式执行,读取当前会话中紧邻前一条语句的受影响行数。

示例

DROP DATABASE IF EXISTS row_count_demo;
CREATE DATABASE row_count_demo;
USE row_count_demo;

CREATE TABLE t (id INT PRIMARY KEY, v INT);
INSERT INTO t VALUES (1, 10), (2, 20);
SELECT ROW_COUNT();
UPDATE t SET v = v + 1 WHERE id IN (1, 2);
SELECT ROW_COUNT();
DELETE FROM t WHERE id = 2;
SELECT ROW_COUNT();
SELECT v FROM t WHERE id = 1;
SELECT ROW_COUNT();

DROP DATABASE row_count_demo;

本示例中的四次 SELECT ROW_COUNT() 依次返回 221-1。如果紧接着再次调用 ROW_COUNT(),仍返回 -1,因为它的前一条语句产生了结果集。