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

SQL触发器中引用NEW报错,如何在子查询访问插入的记录?

解决MySQL触发器中无法识别NEW变量的问题

问题原因

触发器报错的核心原因是MySQL不允许在SELECT语句的LIMIT子句中直接引用NEW对象的属性,虽然WHERE子句中引用NEW.category本身合法,但结合LIMIT NEW.problem_count会触发语法解析错误。

解决方案

先将NEW对象的属性值赋值给局部变量,再在SELECT语句中使用这些局部变量即可:

  • 在触发器的BEGIN块开头声明局部变量,存储新插入记录的test_id、problem_count和category;
  • 将NEW对应属性的值赋值给这些变量;
  • 在后续的SELECT语句中替换为局部变量。

修正后的触发器代码

DELIMITER #
CREATE TRIGGER generate_question_list
AFTER INSERT ON test
FOR EACH ROW
BEGIN
    -- 声明局部变量,需与对应字段类型匹配
    DECLARE new_test_id INT;
    DECLARE new_problem_count INT;
    DECLARE new_category VARCHAR(255);
    
    -- 将NEW对象的属性值赋值给局部变量
    SET new_test_id = NEW.test_id;
    SET new_problem_count = NEW.problem_count;
    SET new_category = NEW.category;
    
    -- 使用局部变量执行插入逻辑
    INSERT INTO question_list (test_id, problem_id)
    SELECT new_test_id, p.problem_id
    FROM problem p 
    WHERE p.category REGEXP new_category
    ORDER BY RAND() 
    LIMIT new_problem_count;
END #
DELIMITER ;

补充说明

  • 局部变量的类型需要和test表对应字段的类型保持一致,比如如果category是TEXT类型,要把VARCHAR(255)改成TEXT;
  • ORDER BY RAND()在数据量较大时性能较差,若problem表数据较多,建议考虑其他随机选题方案(比如通过主键范围生成随机数关联选取)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 15:43:12