You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在MySQL存储过程中遍历逗号分隔值并用于SELECT语句

实现多数据库批量更新的MySQL存储过程

以下是能实现你需求的完整存储过程,它会接收逗号分隔的数据库名称,循环遍历每个库,对对应库中的sample表执行更新操作:

DELIMITER &&  
CREATE PROCEDURE update_multi_db (IN db_list VARCHAR(1000))  
BEGIN  
    DECLARE current_db VARCHAR(100);
    DECLARE remaining_dbs VARCHAR(1000);
    DECLARE current_id INT;
    DECLARE done INT DEFAULT 0;
    -- 声明游标读取Test.Sample中的ID
    DECLARE id_cursor CURSOR FOR SELECT ID FROM Test.Sample;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

    -- 初始化剩余数据库列表
    SET remaining_dbs = db_list;

    -- 循环拆分逗号分隔的数据库名
    WHILE remaining_dbs != '' DO
        -- 取出第一个数据库名
        SET current_db = TRIM(SUBSTRING_INDEX(remaining_dbs, ',', 1));
        -- 更新剩余数据库列表
        SET remaining_dbs = TRIM(SUBSTRING(remaining_dbs, LENGTH(current_db) + 2));

        -- 遍历Test.Sample中的每个ID,执行更新
        OPEN id_cursor;
        id_loop: LOOP
            FETCH id_cursor INTO current_id;
            IF done = 1 THEN
                LEAVE id_loop;
            END IF;

            -- 动态拼接更新语句
            SET @sql = CONCAT(
                'UPDATE `', current_db, '`.`sample` SET COL = 0 WHERE ID = ?'
            );
            -- 预处理并执行
            PREPARE stmt FROM @sql;
            SET @id = current_id;
            EXECUTE stmt USING @id;
            DEALLOCATE PREPARE stmt;
        END LOOP id_loop;
        CLOSE id_cursor;
        -- 重置done标记,准备下一个库的遍历
        SET done = 0;
    END WHILE;
END &&  
DELIMITER ;

关键说明

  • 拆分逗号分隔参数:通过SUBSTRING_INDEX和字符串截取,逐个提取数据库名,直到处理完所有库。
  • 避免使用USE语句:直接在UPDATE中用数据库名.表名的全限定格式,解决USE不能用变量的问题。
  • 安全处理动态SQL:用预处理语句传递ID参数,避免SQL注入风险,同时提升执行效率。
  • 游标遍历ID:从Test.Sample表读取需要更新的ID,对每个数据库的对应记录执行更新。

使用示例

调用存储过程时传入逗号分隔的数据库名:

CALL update_multi_db('DataBase1,Database2,Database10');

内容的提问来源于stack exchange,提问作者mohan111

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 19:35:19