我在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
答案 0 :(得分:0)
如Barmar所述,我可以创建一个循环。
我还发现了一种不太优雅的方法,它可以提取提交的日期并在一周的每一天使用多个触发器:
DATE_ADD(ExtractValue(xmlData,'/ Data / Employee / date'),间隔1天)作为日期 trigger_Monday
的日期DATE_ADD(ExtractValue(xmlData,'/ Data / Employee / date'),间隔2天)为日期 trigger_Tuesday
在Employees表上创建唯一类型的索引可防止重复。