【问题标题】:Selecting values to a variable inside Mysql triggers为 Mysql 触发器中的变量选择值
【发布时间】:2012-09-29 15:07:50
【问题描述】:

好的,我已经看到很多类似的问题,但爬过答案并不能让我的触发器没有错误!
我需要的结果是:每当在数据库表temp_pool 中插入一个新值时,它都会触发,如果新地址不等于先前的地址值,并且dev_id 与此NEW.dev_id 相同,则插入新的位置表的值。

这是查询(示例):

CREATE TRIGGER filter 
after insert on geo.temp_pool
for each row
BEGIN
DECLARE OLD_ADDR VARCHAR(2048);
OLD_AADR = select address from temp_pool where dev_id like NEW.dev_id
order by date desc, time desc limit 1;
IF (OLD_ADDR != NEW.address) THEN
INSERT INTO a3380361_geo.location
VALUES (NEW.dev_id,NEW.address,NEW.lat,NEW.lng,NEW.date,NEW.time);
END IF;
END
$$

我正在使用 phpMyAdmin 编辑器并将分隔符设置为$$

我得到的错误是:

1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以了解在 '= select address from temp_pool where 1 order by date desc, time desc limit 1 附近使用的正确语法; ' 在第 5 行

我坚信将 SELECT 中的值分配给变量 [OLD_ADDR] 存在一些问题,那么有什么办法可以解决我的问题吗?
逻辑很简单,从查询中可以理解需求,对吧?

接受所有意见和建议。

【问题讨论】:

    标签: mysql database triggers phpmyadmin


    【解决方案1】:

    代替:

     OLD_AADR = select address from temp_pool where dev_id like NEW.dev_id
    

    用途:

    SET OLD_AADR = (select address 
                    from temp_pool 
                    where dev_id like NEW.dev_id 
                    order by address 
                    limit 1);
    

    或者使用非标准的SELECT赋值语句(不确定mysql是否支持):

    SELECT OLD_AADR = address from temp_pool where dev_id like NEW.dev_id
                      order by address 
                      limit 1;
    

    并不是说在这两种情况下SELECT 语句都必须只返回一个标量值。这就是我使用LIMIT 1的原因。

    【讨论】:

    • 哇,好快!!谢谢@MahmoudGamal。我会检查一下并很快返回。
    • Woohooo ... 成功了。我对 mysql 中的触发器和程序很陌生。非常感谢@MahmoudGamal。
    【解决方案2】:

    你注意到错字了吗?

    OLD_ADDR OLD_AADR

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-07
      • 2011-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多