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

MySQL 服務端游標限制完整清單:唯讀、非保持、非捲動等特性解析

     編輯:MySQL 資料庫相關知識

背景

MySQL 5.0.2+ 透過 C API mysql_stmt_attr_set() 實作服務端游標,允許在伺服器端產生結果集,客戶端按需抓取,減少網路傳輸。

八大核心限制

限制項目說明影響
唯讀不可透過游標更新/刪除資料無 UPDATE WHERE CURRENT OF、DELETE WHERE CURRENT OF
非保持Commit 後自動關閉跨事務不可重用,需重新 OPEN
不敏感結果集為開啟時快照,後續資料變更不可見類似 INSENSITIVE,避免幻讀但可能過期
不可捲動僅支援 FETCH NEXT,無 PRIOR/FIRST/LAST/ABSOLUTE/RELATIVE無法反向/隨機存取,僅適合單向流式處理
未命名以 Statement Handler 當作游標 ID無法透過名稱管理,API 層面較簡潔
每預處理語句僅 1 個游標需多游標時必須準備多條 Statement增加 Client 端資源佔用
不支援的語句類型CHECK TABLE、HANDLER READ、SHOW BINLOG EVENTS 等僅支援可產生結果集的預處理 SELECT

適用場景與替代方案

✅ 適合場景

  • 大結果集分批抓取(如報表匯出、ETL 抽取),避免客戶端記憶體溢位。
  • 應用邏輯需逐行處理、無法一次性載入記憶體。

❌ 不適合場景

  • 需雙向捲動、書籤定位、遊標更新的複雜邏輯 → 改用應用端暫存表或記憶體陣列。
  • 高併發長事務持有游標 → 鎖競爭、資源洩漏風險。

C API 使用範例

MYSQL_STMT *stmt = mysql_stmt_init(mysql);
mysql_stmt_prepare(stmt, "SELECT id, data FROM big_table WHERE id > ?", strlen(...));
mysql_stmt_bind_param(stmt, &bind_param);
mysql_stmt_attr_set(stmt, STMT_ATTR_CURSOR_TYPE, (void*)CURSOR_TYPE_READ_ONLY);
mysql_stmt_execute(stmt);
mysql_stmt_bind_result(stmt, &bind_result);
while (mysql_stmt_fetch(stmt) == 0) {
    // 處理單行
}
mysql_stmt_close(stmt);

版本演進提示

MySQL 8.0 仍保持相同限制;若需可捲動/可更新游標,建議在應用層實作或評估 PostgreSQL/Oracle 等支援完整 SQL:2003 游標規範的資料庫。

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