mysql - 存储过程只插入一次数据
问题描述
我一直在尝试创建一个存储过程来使用有效日期和有效日期的客户来填充日历表。为了将它们映射到各自的记录,它们被日历表中的外键绑定。
现在,在他们成功注册并创建记录后立即调用存储过程。但是,存储过程只成功运行一次。第一次运行后,不会为后续客户端创建记录。
这是存储过程:
CREATE DEFINER=`root`@`localhost` PROCEDURE `fillGroomerCalendar`(IN `dateStart` DATE, IN `dateEnd` DATE, IN `groomerID` INT)
BEGIN
DECLARE adate date;
START TRANSACTION;
WHILE dateStart <= dateEnd DO
SET adate = (SELECT groomerDate FROM groomer_calendar WHERE groomerDate = dateStart);
IF adate IS NULL THEN BEGIN
INSERT INTO groomer_calendar (groomerID, groomerDate, groomerDateStatus) VALUES (groomerID, dateStart, "Open");
END; END IF;
SET dateStart = date_add(dateStart, INTERVAL 1 DAY);
END WHILE;
COMMIT;
END
感谢您在第一次成功运行后理解为什么失败的任何帮助。
PS:我已经检查了表上是否有导致下一次运行被阻止的锁。但是没有表被锁定。
更新:
根据尼克的评论和他在下面发布的答案,这是更正的程序代码。如果其他人遇到类似问题,这可能会帮助他们找到解决方案。
CREATE DEFINER=`root`@`localhost` PROCEDURE `fillGroomerCalendar`
(IN `dateStart` DATE, IN `dateEnd` DATE, IN `inGroomerID` INT)
BEGIN
DECLARE adate date;
START TRANSACTION;
WHILE dateStart <= dateEnd DO
SET adate = (SELECT groomerDate FROM groomer_calendar
WHERE groomerDate = dateStart AND groomerID = inGroomerID);
IF adate IS NULL THEN BEGIN
INSERT INTO groomer_calendar (groomerID, groomerDate, groomerDateStatus)
VALUES (inGroomerID, dateStart, "Open");
END; END IF;
SET dateStart = date_add(dateStart, INTERVAL 1 DAY);
END WHILE;
COMMIT;
END
解决方案
您的问题是您没有根据特定groomerID
值检查表中的日期,因此当您下次运行具有相似日期的过程时,adate
并不是NULL
因为之前的插入。所以你需要在 for 中添加groomerID
一个SELECT
测试adate
。但是,您还有第二个问题,因为您的列名与您的参数名匹配,因此尝试使用WHERE groomerID = groomerID
将导致相同的问题。您可以将参数名称更改为 egin_groomerID
以解决该问题。所以这应该是你的查询:
SET adate = (SELECT groomerDate
FROM groomer_calendar
WHERE groomerDate = dateStart
AND groomerID = in_groomerID);
推荐阅读
- sqlite - 尝试将带有破折号的 JSON 字符串从 Tcl 传递到浏览器,但无法解析?
- python - 如何使用 tf.keras.Model.summary 和 plot_model 查看子模型的层,而不是看到模型打印最终的顺序层?
- mysql - 美国的产品组在 SQL 中没有销售
- ckeditor - 使用 dropzone.js 时无法保存 CKEditor 的数据
- vim - 有时 Vim 开始忽略 Ctrl 键上的映射
- node.js - 为什么我的 digitalocean 液滴不会从我的 API 请求中返回任何内容
- python - Python - 模拟函数和断言异常
- html - 如何使导航栏菜单在 Buefy 中的任何分辨率下都不会折叠?
- pandas - 根据其他列的值替换pandas.DataFrame的NaN值(根据公式)
- stripe-payments - Stripe 向用户银行账户汇款