Mysql 在插入时启动触发器和例程

Mysql 在插入时启动触发器和例程,mysql,sql,triggers,routines,Mysql,Sql,Triggers,Routines,我试图让MySQL在插入一个表后自动将数据插入另一个表。我知道这样做需要触发器和潜在的例程。我有一对夫妇,我一直在努力修改,以实现我希望实现的目标,但由于缺乏经验,我似乎陷入了死胡同,因此非常感谢您的帮助 已插入数据的表db_tou_跟踪: tou_tracking_ID ICP_ID tou_tracking_start tou_tracking_units ---------------------------------------------------------------

我试图让MySQL在插入一个表后自动将数据插入另一个表。我知道这样做需要触发器和潜在的例程。我有一对夫妇,我一直在努力修改,以实现我希望实现的目标,但由于缺乏经验,我似乎陷入了死胡同,因此非常感谢您的帮助

已插入数据的表db_tou_跟踪:

 tou_tracking_ID  ICP_ID  tou_tracking_start  tou_tracking_units
 ----------------------------------------------------------------
      2             2        2013-03-01            10.77
      3             2        2013-03-01            11.00
这里还有其他几个专栏,它们是按时间分开的,但我感兴趣的是白天,而不是时间

表数据应输入到表中。因此,在插入上述每一行时,如果tou_tracking_start和ICP_ID不存在,它将创建一个新行,或者更新现有行

  tou_tracking_daily_ID  ICP_ID  tou_tracking_start  tou_tracking_units
 ------------------------------------------------------------------------------
             1             2        2013-03-01            21.77
             2             2        2013-03-02            25.36
下面是我在MySQL上安装时的Tigger no errors,当尝试插入数据时,它确实会调用:

BEGIN 
DECLARE presentcount INT;
SET presentcount = (SELECT count(*) FROM db_tou_tracking_daily WHERE tou_tracking_daily_day = 
        (SELECT tou_tracking_start FROM db_tou_tracking WHERE ICP_ID = db_tou_tracking_daily.ICP_ID ORDER BY tou_tracking_ID DESC)
    );
    IF (presentcount = 0) THEN
        INSERT INTO db_tou_tracking_daily (ICP_ID, tou_tracking_daily_day, tou_tracking_start)
            SELECT NEW.ICP_ID, NEW.tou_tracking_start, NEW.tou_tracking_units, calculate_units(NEW.ICP_ID, NEW.tou_tracking_start);
    ELSE 
        UPDATE db_tou_tracking_daily SET tou_tracking_daily_units = calculate_units(NEW.ICP_ID, tou_tracking_daily_day)
            WHERE ICP_ID = NEW.ICP_ID AND tou_tracking_daily_day = NEW.tou_tracking_start;
    END IF;

END
然后它调用例程来计算单位

    CREATE DEFINER=`root`@`localhost` FUNCTION `calculate_units`(ICP_ID INT, tou_tracking_daily_day DATE) RETURNS float
BEGIN
    DECLARE units FLOAT;
    DECLARE last_time DATE;
    DECLARE last_watts INT;
    DECLARE this_time DATETIME;
    DECLARE this_watts INT;
    DECLARE loop_done INT;
    DECLARE curs CURSOR FOR 
        SELECT tou_tracking_timestart, tou_tracking_units FROM db_tou_tracking WHERE ICP_ID = ICP_ID AND tou_tracking_start = tou_tracking_daily_day ORDER BY tou_tracking_start DESC;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET loop_done = 1;

        SET last_time = (SELECT max(tou_tracking_start) FROM db_tou_tracking WHERE ICP_ID = ICP_ID AND tou_tracking_start < tou_tracking_daily_day);
        SET last_watts = (SELECT tou_tracking_units FROM db_tou_tracking WHERE ICP_ID = ICP_ID AND tou_tracking_start = last_time);
        SET last_time = CAST(tou_tracking_start AS DATETIME);

        SET loop_done = 0;
        SET units = 0;

        OPEN curs;
        REPEAT
            FETCH curs INTO this_time, this_watts;

            IF last_watts IS NOT NULL THEN
                SET units = units + (last_watts + this_watts);
            END IF;
            SET last_watts = this_watts;
            SET last_time = this_time;
        UNTIL loop_done END REPEAT;
        CLOSE curs;
    END
当我试图运行SQL来设置例程时,例程在第3行抛出了一个错误,但是我看不到任何明显的错误,但是我不确定我要寻找的是什么


非常感谢您在这方面提供的任何帮助,以及在此过程中可以提供的任何建议。谢谢:

试图复制您的问题,我猜您得到的错误可能是因为您没有使用分隔符

执行类似的函数创建语句时,我会遇到相同的错误,语法分析表明它不需要分隔符

导致第3行出现错误的那个

CREATE DEFINER = 'root'@'localhost' FUNCTION test_func(foo INT) RETURNS FLOAT
BEGIN
    DECLARE bar FLOAT;
    RETURN 1;
END
使用分隔符修复它

DELIMITER $$
CREATE DEFINER = 'root'@'localhost' FUNCTION test_func(foo INT) RETURNS FLOAT
BEGIN
    DECLARE bar FLOAT;
    RETURN 1;
END$$
DELIMITER ;
如果这不能解决您的问题,您是否能够提供一个不依赖任何现有表的自包含函数,该函数也会产生相同的错误,因此可以对其进行测试?

创建表t1开始日期不为null,单位小数5,2不为null

创建表t2开始日期不为空,单位小数5,2不为空

分隔符//

创建触发器trg1 在t1上插入后 每行 开始 更新t2 设置单位=单位+新单位 其中start=new.start; 如果行数=0,则 插入t2 开始,单位 值new.start,new.units; 如果结束; 结束//

定界符//

mysql>从t1中选择*; 空集0.01秒

mysql>从t2中选择*; 空置0.00秒

mysql>插入t1开始,单位值为'2014-01-01',100.02; 查询正常,1行受影响0.01秒

mysql>从t1中选择*; +------+----+ |开始|单位| +------+----+ | 2014-01-01 | 100.02 | +------+----+ 设置为1行0.00秒

mysql>从t2中选择*; +------+----+ |开始|单位| +------+----+ | 2014-01-01 | 100.02 | +------+----+ 设置为1行0.00秒

mysql>插入t1开始,单位值为'2014-01-01',200.05; 查询正常,1行受影响0.01秒

mysql>从t1中选择*; +------+----+ |开始|单位| +------+----+ | 2014-01-01 | 100.02 | | 2014-01-01 | 200.05 | +------+----+ 设置为2行0.01秒

mysql>从t2中选择*; +------+----+ |开始|单位| +------+----+ | 2014-01-01 | 300.07 | +------+----+
设置为0.01秒的1行

您能否提供create table语句和一些样本数据作为insert语句和预期结果?第3行的错误是什么?