mysql - 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
$$
解决方案
你得到两行,因为你正在做两个插入。您需要做的是弄清楚这两个新值是什么,然后同时插入它们。这应该做你想要的:
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
$$
:
请注意,通过实际搜索小时和分钟之间的值并使用它来控制子字符串选择,我对代码的使用更加健壮。
推荐阅读
- magento2 - Magento2 产品详细信息页面的标题显示 404 Not Found Error
- java - 如何关闭带有异步任务的进度对话框并避免“您的活动是否运行错误?”
- javascript - 传输大数据时,CEFPython 窗口在没有警告的情况下关闭
- django - 在哪里修改 django 中的 set_language 方法
- clojure - lein 编译目标路径配置
- sql - 当它是复合键的一部分时,基于列值删除
- node.js - 在 Windows 机器上安装 bcrypt-nodejs 时出现问题
- python - 自定义 sharex 刻度标签
- python - 使用 Anaconda3 在 Pycharm 中丢失了我的 python.exe
- javascript - react-router-modal 无法访问历史记录