创建触发器 MySql 更新或插入另一个表

VbN*_*VbN 6 mysql trigger

我正在尝试更多地了解 mysql 中的触发器,所以请耐心等待。我有两张桌子,

TestTable  
 (id INTEGER PRIMARY KEY AUTO_INCREMENT, ItemId INTEGER,Date date, Value REAL)

TestTable2
 (id INTEGER PRIMARY KEY AUTO_INCREMENT, ItemId INTEGER,Year INTEGER, Month INTEGER, Open REAL, Close REAL, Increase REAL)
Run Code Online (Sandbox Code Playgroud)

其中表 TestTable 是特定日期某个项目的测量值。测试表 2 包含特定月份、年份的测量值以及此期间的增量。

我想创建一个触发器,当我将值插入到 TestTable 中时,它会更新或将值插入到 TestTable2 中。

这就是我尝试创建的触发器的样子,

CREATE TRIGGER 'monthUpdateTrigger' AFTER INSERT ON TestTable 
BEGIN 
IF NOT (EXISTS (SELECT 1 FROM TestTable2 WHERE 
(ItemId=NEW.ItemId AND Year=YEAR(NEW.Date) AND Month=MONTH(NEW.Date)))) 
THEN 
    INSERT INTO TestTable2 (ItemId,Year,Month,Open,Close,Increase ) VALUES 
    (NEW.ItemId , YEAR(NEW.Date), MONTH(NEW.Date),NEW.Value,NEW.Close,0.0); 
ELSE
    UPDATE TestTable2 SET Close=NEW.Close AND Increase=(NEW.Close/(SELECT 
    Open FROM TestTable WHERE (Year=YEAR(NEW.Date) and Month=MONTH(NEW.Date))) 
    WHERE (Year=YEAR(NEW.Date) and Month=MONTH(NEW.Date))
END IF;
END;
Run Code Online (Sandbox Code Playgroud)

但这似乎不起作用,我收到错误消息,

您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取在“BEGIN IF NOT (EXISTS (SELECT 1 FROM TestTable WHERE (ItemId=NEW.ItemId AND Yea) at line 1)”附近使用的正确语法

有人可以指出错误/错误。或者为这个问题提供更好的解决方案。

oNa*_*are 2

首先,您需要指定何时在表内运行触发器。我已经编辑了您的触发器并使用AFTER UPDATEAFTER INSERT

插入后:

USE `TEST`;
DELIMITER $$
DROP TRIGGER IF EXISTS MEDICAMENTO.monthUpdateTriggerAI$$
USE `TEST`$$
    CREATE DEFINER = CURRENT_USER TRIGGER `TEST`.`monthUpdateTriggerAI` AFTER INSERT ON `TestTable` FOR EACH ROW
    BEGIN
    SET @COUNT=(SELECT COUNT(*) FROM TestTable2 WHERE (ItemId=NEW.ItemId AND Year=YEAR(NEW.Date) AND Month=MONTH(NEW.Date)));
    IF @COUNT=0 THEN
        INSERT INTO TestTable2 (ItemId,Year,Month,Open,Close,Increase ) VALUES 
        (NEW.ItemId , YEAR(NEW.Date), MONTH(NEW.Date),NEW.Value,NEW.Close,0.0); 
    ELSE
        UPDATE TestTable2 SET TestTable2.Close=NEW.Close AND Increase=(NEW.Close/(SELECT 
        Open FROM TestTable WHERE (Year=YEAR(NEW.Date) and Month=MONTH(NEW.Date)) LIMIT 1))
        WHERE (Year=YEAR(NEW.Date) and Month=MONTH(NEW.Date));
    END IF;
    END;
$$
DELIMITER ;
Run Code Online (Sandbox Code Playgroud)

更新后:

USE `TEST`;
DELIMITER $$
DROP TRIGGER IF EXISTS MEDICAMENTO.monthUpdateTriggerAU$$
USE `TEST`$$
    CREATE DEFINER = CURRENT_USER TRIGGER `TEST`.`monthUpdateTriggerAU` AFTER UPDATE ON `TestTable` FOR EACH ROW
BEGIN

    UPDATE TestTable2 SET TestTable2.Close=NEW.Close AND Increase=(NEW.Close/(SELECT 
    Open FROM TestTable WHERE (Year=YEAR(NEW.Date) and Month=MONTH(NEW.Date)) LIMIT 1))
    WHERE (Year=YEAR(NEW.Date) and Month=MONTH(NEW.Date));

END;
$$
DELIMITER ;
Run Code Online (Sandbox Code Playgroud)

注意:请小心SELECT Open FROM TestTable WHERE (Year=YEAR(NEW.Date) and Month=MONTH(NEW.Date)),我添加了LIMIT 1以避免重复行。

更改数据库TEST

您还可以使用ON DUPLICATE KEY两个触发器执行。

您可以在MySQL 的文档手册中获取更多信息。