将VARCHAR中的时间转换为INTEGER中的秒的MYSQL触发器是在应该只插入的情况下插入多行



现在,情况如下:

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

此触发器的目的是将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
$$

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

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
$$

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

相关内容

最新更新