你提到的 “Cursor 游标如何批量操作”,通常出现在 数据库开发(如 MySQL / PostgreSQL / SQL Server) 或 编程语言中的数据库访问(如 Python、Java) 场景中。下面我分几种常见情况说明 游标(Cursor)批量操作 的做法和最佳实践。
DELIMITER $$
CREATE PROCEDURE batch_update()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE uid INT;
DECLARE cur CURSOR FOR SELECT id FROM users WHERE status = 0;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN cur;
read_loop: LOOP
FETCH cur INTO uid;
IF done THEN
LEAVE read_loop;
END IF;
-- 批量更新示例(逐条,但逻辑可优化)
UPDATE users SET status = 1 WHERE id = uid;
END LOOP;
CLOSE cur;
END$$
DELIMITER ;
✅ 注意:
UPDATE users
SET status = 1
WHERE id IN (
SELECT id FROM users WHERE status = 0 LIMIT 1000
);
✅ 分批次(如每次 1000 条)循环执行,性能远好于游标。
for row in cursor.fetchall():
cursor.execute("UPDATE t SET col=%s WHERE id=%s", (val, row[0]))
data = cursor.fetchall()
update_data = [(new_val, row[0]) for row in data]
cursor.executemany(
"UPDATE t SET col=%s WHERE id=%s",
update_data
)
conn.commit()
while True:
cursor.execute(
"SELECT id FROM t LIMIT 1000 OFFSET %s", (offset,)
)
rows = cursor.fetchall()
if not rows:
break
cursor.executemany(
"UPDATE t SET flag=1 WHERE id=%s",
[(r[0],) for r in rows]
)
conn.commit()
offset += 1000
DECLARE cur CURSOR FOR
SELECT id FROM users WHERE flag = 0;
OPEN cur;
FETCH NEXT FROM cur INTO @id;
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE users SET flag = 1 WHERE id = @id;
FETCH NEXT FROM cur INTO @id;
END;
CLOSE cur;
DEALLOCATE cur;
⚠️ 同样建议:能用 UPDATE ... WHERE 就别用游标。
✅ 适合:
❌ 不适合:
| 场景 | 推荐方式 |
|---|---|
| 简单批量更新 | UPDATE + WHERE |
| 超大表 | 分页 / LIMIT + 批量 |
| 编程语言 | fetch → executemany |
| 复杂逐行逻辑 | 游标(最后手段) |
如果你能告诉我:
我可以给你 更精准的示例代码。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。