我正在尝试使用此代码
使用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
不被视为变量?
答案 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中构建一个查询字符串,然后准备/执行它。