【问题标题】:mysql: new keyword not recognized on trigger creationmysql:创建触发器时无法识别新关键字
【发布时间】:2025-12-02 19:00:02
【问题描述】:

正在处理mysql.5.7

这是我的bugs

MySQL [jira_statistics]> describe bugs;
+---------------------------------------+--------------+------+-----+---------+-------+
| Field                                 | Type         | Null | Key | Default | Extra |
+---------------------------------------+--------------+------+-----+---------+-------+
| issue_key                             | varchar(45)  | NO   | PRI | NULL    |       |
| release_name                          | varchar(45)  | YES  | MUL | NULL    |       |
| issue_summary                         | varchar(200) | YES  |     | NULL    |       |
| story_points                          | int(11)      | NO   |     | 0       |       |
| qa_reopened                           | float        | NO   |     | 0       |       |
| done_reopened                         | float        | NO   |     | 0       |       |

此表通过定期调用 LOAD DATA LOCAL INFILE bugs <file.csv> 进行更新

无论何时发生此更新(可能会更新现有行和/或插入新行),我希望通过以下触发器更新另一个包含一些已生成统计信息的表

create trigger update_bugs_stats after insert on `jira_statistics`.`bugs` for each row

begin

delimiter ;

 -- STORY POINTS -------------------------

SELECT AVG(story_points) INTO @avg_bugs_storypoints  FROM `jira_statistics`.`bugs` WHERE release_name = new.release_name;
SELECT MAX(story_points) INTO @max_bugs_storypoints FROM `jira_statistics`.`bugs` WHERE release_name = new.release_name;
SELECT MIN(story_points) INTO @min_bugs_storypoints  FROM `jira_statistics`.`bugs` WHERE release_name =  new.release_name;

INSERT INTO storypoints_stats (release_name, avg_bugs_storypoints, max_bugs_storypoints, min_bugs_storypoints)
VALUES (relName, @avg_bugs_storypoints, @max_bugs_storypoints, @min_bugs_storypoints)
ON DUPLICATE KEY UPDATE 
    relName=new.release_name,
    avg_bugs_storypoints=@avg_bugs_storypoints,
    max_bugs_storypoints=@max_bugs_storypoints,
    min_bugs_storypoints=@min_bugs_storypoints;

但是,每当尝试创建触发器时,都会出现以下错误:

where 子句中的未知列 new.release_name

为什么无法识别new 关键字?

【问题讨论】:

  • 分隔符语句应该在触发器定义之前。我想知道选择是否实际上是在触发器之外评估的,这可以解释错误消息(触发器之外没有新表)。

标签: mysql triggers mysql-5.7


【解决方案1】:

因为 new 被保留为系统字

参考:https://dev.mysql.com/doc/refman/8.0/en/keywords.html

请修改

new.release_name  ==> `new`.`release_name`

等等。

【讨论】:

  • 是的,我正在尝试获取在插入语句期间更新的release_name 的值;这就是我使用new 关键字的原因;
  • new 实际上不是保留字,而是关键字
【解决方案2】:

他的错误比我想象的更愚蠢;

我直接在 sql 查询编辑器上工作,而不是在 mysql 工作台的触发器选项卡上工作,因此它没有正确解析 new 关键字`。

【讨论】:

  • 你最好删除查询帖子而不是回答不可生产的错误