在插入触发器创建失败之前 MariaDB

Before insert trigger creation is failing MariaDB

我无法弄清楚我在使用此插入触发器时做错了什么。正在尝试读取目标 table 的最后一行并相应地设置状态。错误消息将我指向手册,这是我开始的地方;).. 组件查询有效但放在一起不是那么多..

    MariaDB [tide]> desc Marsh; 
    +--------+--------------+------+-----+---------------------+-------+
    | Field  | Type         | Null | Key | Default             | Extra |
    +--------+--------------+------+-----+---------------------+-------+
    | time   | timestamp    | NO   | PRI | current_timestamp() |       |
    | Sensor | int(3)       | YES  |     | NULL                |       |
    | NOAA   | decimal(3,2) | YES  |     | NULL                |       |
    | rNum   | int(1)       | YES  |     | NULL                |       |
    | state  | varchar(5)   | NO   |     | slack               |       |
    +--------+--------------+------+-----+---------------------+-------+

我的触发器

   DELIMITER $$
   CREATE TRIGGER trend_before_insert
   BEFORE INSERT
   ON Marsh FOR EACH ROW
   BEGIN
   DECLARE LASTREAD decimal(3,2) DEFAULT 0
   SELECT NOAA
   INTO LASTREAD
   FROM Marsh
   WHERE time in (select max(time) from Marsh);
   IF NOAA > LASTREAD THEN
   SET state = 'flow';
   END IF;
   IF NOAA < LASTREAD THEN       
   SET state = "ebb";
   END IF;
   END$$
   DELIMITER ;

数据样本:

    | 2021-05-04 12:25:28 |    175 | 1.26 |    6 | slack |
    | 2021-05-04 12:35:31 |    175 | 1.26 |    1 | slack |
    | 2021-05-04 12:45:28 |    175 | 1.26 |    2 | slack |

关键查询: MariaDB [tide]> SELECT 来自 Marsh 的 NOAA where time in (select max(time) from Marsh);

    +------+
    | NOAA |
    +------+
    | 1.26 |
    +------+
    1 row in set (0.001 sec)

返回的错误是 ERROR 1064 (42000) - 不幸的是,我非常刻意地根据已发布的示例对语法进行了建模。这只是一个业余爱好项目,这里唯一的利害关系是我一直的无知。对于更好的方法的建议 - 无论它是什么 - 总是会受到赞赏。

你漏了一个分号 在默认 0

之后

你还需要新的。用于寻址插入行的列的前缀

DELIMITER $$
CREATE TRIGGER trend_before_insert
BEFORE INSERT
ON Marsh FOR EACH ROW
BEGIN
   DECLARE LASTREAD decimal(3,2) DEFAULT 0;
   SELECT NOAA
        INTO LASTREAD
   FROM Marsh
   WHERE time in (select max(time) from Marsh);
   IF NEW.NOAA > LASTREAD THEN
        SET NEW.state = 'flow';
   END IF;
   IF NEW.NOAA < LASTREAD THEN       
        SET NEW.state = "ebb";
   END IF;
END$$
DELIMITER ;