在触发器中声明和使用变量

Posted

技术标签:

【中文标题】在触发器中声明和使用变量【英文标题】:declaring and using variables in a trigger 【发布时间】:2013-07-20 10:15:52 【问题描述】:

我在我的 mysql 触发器中声明了一些变量

DELIMITER //
CREATE TRIGGER lestrigger
    AFTER INSERT ON examinations
   FOR EACH ROW
  BEGIN
    DECLARE the_last_inserted_id INT ;
    DECLARE the_class_id INT;
    DECLARE the_year_id INT;

    SET the_last_inserted_id = LAST_INSERT_ID();
    SET the_class_id = select examination_class_id from examinations where examination_id = the_last_inserted_id;
    SET the_year_id = select examination_class_year_id from examinations where examination_id = the_last_inserted_id;

    insert into examination_data (ed_cs_id,ed_examination_id) select cs_id from class_students where cs_class_id = the_class_id AND cs_year_id = the_year_id,the_last_inserted_id;

END
  //
DELIMITER ;

但我不断收到此错误

/* SQL 错误 (1064): 你的 SQL 语法有错误;检查 与您的 MySQL 服务器版本相对应的手册 在“从考试中选择考试类别ID”附近使用的语法 其中考试 ID = the_last_in' 在第 10 行 */

我在语法上使用变量的方式是否正确?

【问题讨论】:

尝试在选择查询周围添加括号。 ***.com/questions/12797424/… 【参考方案1】:

使用INTO关键字http://dev.mysql.com/doc/refman/5.0/en/select-into.html

select examination_class_id into the_class_id from examinations where examination_id = the_last_inserted_id;
select examination_class_year_id into the_year_id from examinations where examination_id = the_last_inserted_id;

【讨论】:

这也行得通,但是这个insert into examination_data (ed_cs_id,ed_examination_id) (select cs_id from class_students where cs_class_id = the_class_id AND cs_year_id = the_year_id),the_last_inserted_id); 怎么样。我正在尝试插入一个额外的列。我是否也用() 包围select 语句?。跨度> 不确定括号,但不会严重影响查询。因此,如果您不确定,请添加它。否则,您的查询是正确的,除了数据前缺少关键字VALUES

以上是关于在触发器中声明和使用变量的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 触发器 - 将 SELECT 存储在变量中

触发器中的 :OLD 和 :NEW 变量属于啥数据类型?

如何在mysql触发器中声明If语句

SP2-0552:未声明绑定变量“NEW”

SQL中啥时候要用declare声明变量

Oracle笔记4-pl/sql-分支/循环/游标/异常/存储/调用/触发器