MySQL 后端更新时触发错误
MySQL Trigger error while updating in backend
您好,我需要帮助解决以下问题。我有 table 数据每分钟更新一次。我在 table.
上设置了触发器
CREATE DEFINER=`root`@`localhost` TRIGGER `gsdatatabs_AFTER_UPDATE` AFTER UPDATE ON
`gsdatatabs` FOR EACH ROW BEGIN
IF NEW.CAMARILLA = 'B' or NEW.CAMARILLA = 'S' then
UPDATE gsdatatabs SET ALERT = NEW.LTP;
END IF;
END
下面是我的table结构
Columns:
SCRIP varchar(45)
LTP float
OHL varchar(45)
ORB15 varchar(45)
ORB30 varchar(45)
PRB varchar(45)
CAMARILLA varchar(45)
ALERT float
当 CAMARILLA 值为 'B' 或 'S' 时,我正在尝试使用来自 LTP 的值更新 ALERT 列。在后端,CAMARILLA 列的数据每分钟更新一次。
目前在后台更新时出错。
Error: Can't update table 'gsdatatabs' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
at Packet.asError (C:\Users\sprasadswain\Documents\googleSheet\AutoTrader\Server\node_modules\mysql2\lib\packets\packet.js:722:17)
at Query.execute (C:\Users\sprasadswain\Documents\googleSheet\AutoTrader\Server\node_modules\mysql2\lib\commands\command.js:28:26)
at Connection.handlePacket (C:\Users\sprasadswain\Documents\googleSheet\AutoTrader\Server\node_modules\mysql2\lib\connection.js:456:32)
at PacketParser.onPacket (C:\Users\sprasadswain\Documents\googleSheet\AutoTrader\Server\node_modules\mysql2\lib\connection.js:85:12)
at PacketParser.executeStart (C:\Users\sprasadswain\Documents\googleSheet\AutoTrader\Server\node_modules\mysql2\lib\packet_parser.js:75:16)
at Socket.<anonymous> (C:\Users\sprasadswain\Documents\googleSheet\AutoTrader\Server\node_modules\mysql2\lib\connection.js:92:25)
at Socket.emit (events.js:315:20)
敬请指导
看来你需要在
CREATE DEFINER=`root`@`localhost` TRIGGER `gsdatatabs_BEFORE_UPDATE`
BEFORE UPDATE ON `gsdatatabs`
FOR EACH ROW
SET NEW.alert = CASE WHEN NEW.camarilla IN ('B', 'S')
-- AND NEW.alert IS NULL
THEN NEW.ltp
ELSE NEW.alert
END;
改成更新前
CREATE DEFINER=`root`@`localhost` TRIGGER `gsdatatabs_AFTER_UPDATE` BEFORE UPDATE ON
`gsdatatabs` FOR EACH ROW BEGIN
IF NEW.CAMARILLA = 'B' or NEW.CAMARILLA = 'S' then
SET NEW.ALERT = NEW.LTP;
END IF;
END
您好,我需要帮助解决以下问题。我有 table 数据每分钟更新一次。我在 table.
上设置了触发器 CREATE DEFINER=`root`@`localhost` TRIGGER `gsdatatabs_AFTER_UPDATE` AFTER UPDATE ON
`gsdatatabs` FOR EACH ROW BEGIN
IF NEW.CAMARILLA = 'B' or NEW.CAMARILLA = 'S' then
UPDATE gsdatatabs SET ALERT = NEW.LTP;
END IF;
END
下面是我的table结构
Columns:
SCRIP varchar(45)
LTP float
OHL varchar(45)
ORB15 varchar(45)
ORB30 varchar(45)
PRB varchar(45)
CAMARILLA varchar(45)
ALERT float
当 CAMARILLA 值为 'B' 或 'S' 时,我正在尝试使用来自 LTP 的值更新 ALERT 列。在后端,CAMARILLA 列的数据每分钟更新一次。
目前在后台更新时出错。
Error: Can't update table 'gsdatatabs' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
at Packet.asError (C:\Users\sprasadswain\Documents\googleSheet\AutoTrader\Server\node_modules\mysql2\lib\packets\packet.js:722:17)
at Query.execute (C:\Users\sprasadswain\Documents\googleSheet\AutoTrader\Server\node_modules\mysql2\lib\commands\command.js:28:26)
at Connection.handlePacket (C:\Users\sprasadswain\Documents\googleSheet\AutoTrader\Server\node_modules\mysql2\lib\connection.js:456:32)
at PacketParser.onPacket (C:\Users\sprasadswain\Documents\googleSheet\AutoTrader\Server\node_modules\mysql2\lib\connection.js:85:12)
at PacketParser.executeStart (C:\Users\sprasadswain\Documents\googleSheet\AutoTrader\Server\node_modules\mysql2\lib\packet_parser.js:75:16)
at Socket.<anonymous> (C:\Users\sprasadswain\Documents\googleSheet\AutoTrader\Server\node_modules\mysql2\lib\connection.js:92:25)
at Socket.emit (events.js:315:20)
敬请指导
看来你需要在
CREATE DEFINER=`root`@`localhost` TRIGGER `gsdatatabs_BEFORE_UPDATE`
BEFORE UPDATE ON `gsdatatabs`
FOR EACH ROW
SET NEW.alert = CASE WHEN NEW.camarilla IN ('B', 'S')
-- AND NEW.alert IS NULL
THEN NEW.ltp
ELSE NEW.alert
END;
改成更新前
CREATE DEFINER=`root`@`localhost` TRIGGER `gsdatatabs_AFTER_UPDATE` BEFORE UPDATE ON
`gsdatatabs` FOR EACH ROW BEGIN
IF NEW.CAMARILLA = 'B' or NEW.CAMARILLA = 'S' then
SET NEW.ALERT = NEW.LTP;
END IF;
END