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
相关产品推荐
相关产品推荐

