兩大核心函數
| 函數 | 適用操作 | 說明 |
ROW_COUNT() | INSERT / UPDATE / DELETE | 返回上一條修改類語句影響的行數 |
FOUND_ROWS() | SELECT | 返回上一條 SELECT 查詢的行數(配合 SQL_CALC_FOUND_ROWS) |
完整測試腳本
DROP DATABASE IF EXISTS mytest;
CREATE DATABASE mytest;
USE mytest;
DROP TABLE IF EXISTS MyTestTable;
CREATE TABLE MyTestTable (ID INT, Name VARCHAR(10));
-- 插入 3 筆測試資料
INSERT INTO MyTestTable (ID, Name)
SELECT '1','role1' UNION ALL
SELECT '2','role2' UNION ALL
SELECT '3','role3';
SELECT ROW_COUNT(); -- 輸出 3(UNION ALL 批次插入返回實際行數)
-- 注意:INSERT ... VALUES 單行僅返回 1
SELECT * FROM MyTestTable;
SELECT FOUND_ROWS(); -- 輸出 3
UPDATE MyTestTable SET Name = 'people';
SELECT ROW_COUNT(); -- 輸出 3
DELETE FROM MyTestTable;
SELECT ROW_COUNT(); -- 輸出 3
關鍵行為差異
| 語句類型 | ROW_COUNT() | FOUND_ROWS() |
| INSERT ... VALUES (單行) | 1 | N/A |
| INSERT ... SELECT / UNION ALL | 實際插入行數 | N/A |
| UPDATE | 實際修改行數 | N/A |
| DELETE | 實際刪除行數 | N/A |
| SELECT | -1(無意義) | 查詢行數 |
| 無前置 DML/查詢 | -1 | 0 |
進階應用:預存程序中判斷執行結果
CREATE PROCEDURE batch_insert()
BEGIN
INSERT INTO log (msg) VALUES ('test');
IF ROW_COUNT() = 1 THEN
SELECT 'SUCCESS';
ELSE
SELECT 'FAILED';
END IF;
END;
常見誤區
- ❌ 以為
ROW_COUNT() 對 SELECT 有效 → 實際返回 -1
- ❌ 以為
FOUND_ROWS() 對 UPDATE 有效 → 實際返回 0
- ❌ 獨立呼叫函數未緊跟目標語句 → 返回預設值(-1/0)
- ✅ 必須**緊接著**目標語句呼叫,中間不能有其他語句
PHP/Java 等驅動層替代方案
- PHP mysqli:
$mysqli->affected_rows
- PDO:
$stmt->rowCount()(僅 INSERT/UPDATE/DELETE)
- JDBC:
stmt.getUpdateCount()
- Python:
cursor.rowcount