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