使用其他查询和插入逻辑更新MySQL触发器

时间:2019-12-20 22:12:45

标签: mysql

我在MySQL 5.7.28数据库中有两个表。一个表,其中包含来自表单的提交的XML数据,该表转储到名为 xmlData 的单个列中 第二个表用作基于Datatables的JS网站的数据源,称为 Employees

当xml数据首次提交到 xmlData 表时,我使用下面的MySQL触发器进行解析并将数据插入 Employees

use test;

DELIMITER $$
DROP TRIGGER IF EXISTS test.Update_xmlData$$
CREATE TRIGGER test.Update_xmlData AFTER INSERT ON xmlData

FOR EACH ROW BEGIN

replace INTO employees (first_name, last_name, startTime, endtime, date)

select ExtractValue(xmlData, '/Data/Employee/first_name') as first_name,
ExtractValue(xmlData, '/Data/Employee/last_name') as last_name,
ExtractValue(xmlData, '/Data/Employee/StartTime') as startTime,
ExtractValue(xmlData, '/Data/Employee/EndTime') as endtime,
ExtractValue(xmlData, '/Data/Employee/date') as date
from xmlData;

END

其输出看起来像这样

---------------------------------------------------------------------
first_name |  last_name   |   startTime   |   endTime   |     Date
---------------------------------------------------------------------
  Luke     |  Skywalker   |   08:00       |    15:00    |  2019-12-05
----------------------------------------------------------------------
  Santa    |   Clause     |   08:00       |    14:00    |  2019-12-25
----------------------------------------------------------------------

此触发器可以正常工作并正确插入数据。复杂之处在于,提交的xmlData行中可能有多个 开始时间和结束时间。一周的每一天都有一套。 目前,我想查询提交的XML,并将这些值作为单独的行保留在 Employees 表中。例如,如果有星期一,星期二和星期三的开始/结束时间 插入的数据如下所示:

---------------------------------------------------------------------
first_name |  last_name   |   startTime   |   endTime   |     Date
---------------------------------------------------------------------
  Luke     |  Skywalker   |   08:00       |    15:00    |  2019-12-05
----------------------------------------------------------------------
  Luke     |  Skywalker   |   09:00       |    17:45    |  2019-12-06
----------------------------------------------------------------------
  Luke     |  Skywalker   |   06:00       |    18:00    |  2019-12-07
----------------------------------------------------------------------
  Santa    |   Clause     |   08:00       |    15:00    |  2019-12-25
----------------------------------------------------------------------

如果在一周的其他几天中都有现有的StartTime / EndTime,更新触发器以插入新行的最佳方法是什么?此时1个触发器是否仍然可行?

简而言之,我在思考:

IF TuesdayStartTime and TuesdayEndTime EXISTS THEN insert into Employees another row retaining the same name field values, increment date by 1 day, 
IF WednesdayStartTime and WednesdayEndTime EXISTS THEN insert into EMployees another row retaining the same name field values and increment date by 2 days

正在查询并插入到employees表中的提交的XML:

XML样本源Schwartz 08:00 09:00 11:0018:0020191221051312

1 个答案:

答案 0 :(得分:0)

如Barmar所述,我可以创建一个循环。

我还发现了一种不太优雅的方法,它可以提取提交的日期并在一周的每一天使用多个触发器:

DATE_ADD(ExtractValue(xmlData,'/ Data / Employee / date'),间隔1天)作为日期 trigger_Monday

的日期

DATE_ADD(ExtractValue(xmlData,'/ Data / Employee / date'),间隔2天)为日期 trigger_Tuesday

在Employees表上创建唯一类型的索引可防止重复。