在插入触发器创建失败之前 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 ;
我无法弄清楚我在使用此插入触发器时做错了什么。正在尝试读取目标 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 ;