更新触发器中的表失败

时间:2014-08-13 18:53:19

标签: mysql

我正在尝试使用此代码

使用after insert触发器更新表格
SET @OLDTMP_SQL_MODE=@@SQL_MODE, SQL_MODE='STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
DELIMITER //
CREATE TRIGGER `le_log_trigger` AFTER INSERT ON `messagelog` FOR EACH ROW BEGIN
declare last_inserted_number VARCHAR(100) DEFAULT '0800100200';
declare last_inserted_code VARCHAR(100) DEFAULT 'Lorem Ipsum';
declare current_dataset VARCHAR(100) DEFAULT 'Lorem Ipsum';

set last_inserted_number = NEW.messagefrom;
set last_inserted_code = NEW.statuscode;
set current_dataset = (select task_name from running_tasks limit 1);

if(last_inserted_code = 201) then

update current_dataset set the_status = 'online' where device_number = last_inserted_number;

end if;

END//
DELIMITER ;

我的数据库名为logan,当触发器运行时我收到此错误

/* SQL Error (1146): Table 'logan.current_dataset' doesn't exist */

为什么current_dataset不被视为变量?

1 个答案:

答案 0 :(得分:2)

因为您正在尝试进行UPDATE查询。 MySQL期望看到一个表名,你已经得到了你的变量,所以它不会“哦,嘿,这是先前声明的变量”。它只是假设它应该是一个文字表名,并寻找那个表...并且因为它找不到(因为它不存在),你就会得到那个错误。

如果你偶然得到一个表格,其中一个字段名称与变量名称共同包含,例如。

table x (foo int, bar int);
set bar='baz';

并且做了

UPDATE x SET foo=bar
那时你遇到了问题。应该使用哪个bar?你是指变量,还是现场?这就是@

的原因
UPDATE x SET foo=bar ; // use "bar" field in the table
UPDATE x SET foo=@bar; // use variable "bar" value.

请注意,您无法将变量用作表名,例如

SET x = 'tablename';
UPDATE @x SET ...

只是一个平坦的语法错误。你必须在你的sproc中构建一个查询字符串,然后准备/执行它。