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

AWS RDS MySQL调用存储过程报错:子查询返回多行

解决存储过程调用时的Error Code: 1242问题

让我直接帮你定位问题并解决!

错误原因分析

你遇到的Error Code: 1242. Subquery returns more than 1 row错误,根源出在调用存储过程的子查询里——你加了GROUP BY receiver_id,这会让查询结果返回多行单个ID值,而不是你期望的一个包含所有ID的逗号分隔字符串。存储过程的ReceiverIds参数只能接收单个值,自然就触发报错了。

修正后的调用语句

只需要去掉子查询里的GROUP BY receiver_id,GROUP_CONCAT本身就会把所有符合条件的receiver_id合并成一个逗号分隔的字符串:

SET group_concat_max_len = 2048;
call MyProcedure(
    'random_test_uuid',
    (
        SELECT CAST(GROUP_CONCAT(receiver_id SEPARATOR ',') AS CHAR) AS receiver_ids
        FROM receiver
        WHERE user_id LIKE (SELECT user_id FROM user WHERE user_name LIKE 'myName')
        -- 移除了这里的GROUP BY receiver_id
    ),
    '2017-09-24 23:44:32'
);

额外优化建议:提升存储过程的执行效率

你当前的存储过程用循环逐条插入数据,当ID数量较多时效率会很低。推荐用递归CTE拆分字符串+批量插入的方式改写,性能会好很多:

DELIMITER //
CREATE PROCEDURE MyProcedure(
    IN ItemUUID VARCHAR(255),
    IN ReceiverIds TEXT,
    IN ItemCreated VARCHAR(255)
)
BEGIN
    -- 提前处理空值,避免无效操作
    IF ReceiverIds IS NULL OR ReceiverIds = '' THEN
        RETURN;
    END IF;

    -- 用递归CTE拆分逗号分隔的ID串
    WITH RECURSIVE split_ids AS (
        SELECT 
            SUBSTRING_INDEX(ReceiverIds, ',', 1) AS receiver_id,
            SUBSTRING(ReceiverIds, LENGTH(SUBSTRING_INDEX(ReceiverIds, ',', 1)) + 2) AS remaining_ids
        UNION ALL
        SELECT 
            SUBSTRING_INDEX(remaining_ids, ',', 1) AS receiver_id,
            SUBSTRING(remaining_ids, LENGTH(SUBSTRING_INDEX(remaining_ids, ',', 1)) + 2) AS remaining_ids
        FROM split_ids
        WHERE remaining_ids != ''
    )
    -- 批量插入所有拆分后的ID
    INSERT INTO item_receiver (item_uuid, receiver_id, item_created)
    SELECT ItemUUID, receiver_id, ItemCreated
    FROM split_ids;
END//
DELIMITER ;

这种方式会一次性拆分所有ID,然后通过单条INSERT语句完成批量插入,比循环逐条插入的效率提升非常明显,尤其是当需要处理成百上千个ID的时候。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:25:43