首页 > 解决方案 > MYSQL - 将 VARCHAR 中的时间转换为 INTEGER 中的秒数的触发器在应该只插入时插入多行

问题描述

现在,这是怎么回事:

当我在tbl_a中插入具有 time1 和 time2 值的行时,我的触发器在tbl_b中插入 2 个不同的行,当它应该插入 1 个具有两列值的行时,每列一个。

此触发器的目的是将 VARCHAR 列中导入的时间数据转换为 INTEGER 列中的秒数。问题是导入的数据可以是 10:00 或 1000:00。

尽管我意识到可能有更简单的方法可以做到这一点,但我真的很想知道这段代码有什么问题。

提前致谢!

DELIMITER $$
CREATE TRIGGER  tr_one
AFTER INSERT ON tbl_a
FOR EACH ROW 
BEGIN
    IF CHAR_LENGTH(NEW.time1) = 5 THEN 
        INSERT INTO tbl_b(time1) VALUES((((SUBSTRING(NEW.time1, 1, 5) * 60) + SUBSTRING(NEW.time1, 7, 2)) * 60));
        END IF;

    IF CHAR_LENGTH(NEW.time2) = 5 THEN 
        INSERT INTO tbl_b (time2) VALUES (((SUBSTRING(NEW.time2, 1, 5) * 60) + SUBSTRING(NEW.time2, 7, 2)) * 60);
    END IF;
END
$$

标签: mysqltimetriggers

解决方案


你得到两行,因为你正在做两个插入。您需要做的是弄清楚这两个新值是什么,然后同时插入它们。这应该做你想要的:

DELIMITER $$
CREATE TRIGGER tr_one
AFTER INSERT ON tbl_a
FOR EACH ROW 
BEGIN
    DECLARE t1 VARCHAR(10) DEFAULT NEW.time1;
    DECLARE t2 VARCHAR(10) DEFAULT NEW.time2;
    DECLARE c INT;
    SET c = LOCATE(':', t1);
    IF c > 0 THEN
        SET t1 = (SUBSTRING(t1, 1, c-1) * 60 + SUBSTRING(t1, c+1)) * 60;
    END IF;
    SET c = LOCATE(':', t2);
    IF c > 0 THEN 
        SET t2 = (SUBSTRING(t2, 1, c-1) * 60 + SUBSTRING(t2, c+1)) * 60;
    END IF;
    INSERT INTO tbl_b (time1, time2) VALUES (t1, t2);
END
$$

:请注意,通过实际搜索小时和分钟之间的值并使用它来控制子字符串选择,我对代码的使用更加健壮。


推荐阅读