首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL ROW_COUNT() 實戰陷阱:動態 SQL 執行後取值順序導致返回 -1

     編輯:MySQL 資料庫相關知識

ROW_COUNT() 返回 -1 的經典錯誤與修正

在使用 PREPARE 動態執行 UPDATE 後,若在 DEALLOCATE PREPARE 之後 呼叫 ROW_COUNT(),將得到 -1 而非預期的影響行數。正確順序必須緊接在 EXECUTE 之後。

錯誤示範

PREPARE stmt FROM 'UPDATE t SET address=? WHERE id=?';
EXECUTE stmt USING 'beijing', 1;
DEALLOCATE PREPARE stmt;  -- 此處釋放預備語句
SELECT ROW_COUNT();       -- 返回 -1 ❌

正確寫法

PREPARE stmt FROM 'UPDATE t SET address=? WHERE id=?';
EXECUTE stmt USING 'beijing', 1;
SELECT ROW_COUNT();       -- 返回 1 ✅
DEALLOCATE PREPARE stmt;

核心規則回顧

  • ROW_COUNT() 反映緊鄰前一條 INSERT/UPDATE/DELETE 的影響行數。
  • 任何中間語句 (含 DEALLOCATE、SELECT、SET 等) 都會重置計數器。
  • 若前一條語句未修改任何行 (值相同),返回 0;語句錯誤返回 -1。

延伸應用:存儲過程中安全捕獲

CREATE PROCEDURE safe_update(IN p_id INT, IN p_addr VARCHAR(100), OUT affected INT)
BEGIN
  UPDATE t SET address = p_addr WHERE id = p_id;
  SET affected = ROW_COUNT();  -- 立即存入輸出參數
END;

此模式確保不受後續邏輯干擾,適用於需根據影響行數決定後續流程 (如發送通知、寫入審計日誌) 的場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved