“插入后触发器”中元素的MySQL顺序

时间:2013-08-05 20:52:34

标签: mysql triggers

我需要创建一个触发器,它接受一个平坦的事件源并使用start_time和end_time将其转换为一行。

有两个系统和一个作业将数据从一个传递到另一个:

 ________            _________
|        |   Job    | Destiny |
| Source |  ----->  |         |
|________|   data   |_Trigger_|

Inside Destiny,有两个表:

 ____________________              ________________________
|                    |   Trigger  |                        |
|  Flat event table  | <--------- |  Copy of source table  |
|____________________|            |________________________|

以下代表来源的一个例子:

|    datetime    | tagname | value |
  1/1/13 07:00       tag       1
  1/1/13 07:05       tag       0
  1/1/13 10:07       tag       1
  1/1/13 13:13       tag       0

我需要数据看起来像:

|   id   |  start_time  |   end_time   |   duration  |   uptime  | reason
  event1   1/1/13 07:00   1/1/13 07:05        5             0       xxx
  event2   1/1/13 10:07   1/1/13 13:13       76            182      yxy  

到目前为止,我已经创建了找到最后一个事件并对其进行更新的逻辑,并且除了一个小细节之外它一直正常工作:如果事件经常发生,系统将创建大量插入,并且批量正在以奇怪的顺序执行。

如果这在某种程度上有用,这是我用来获取正确id的触发器的一部分: (有关完整代码,请单击here

select delays.id,product_id,crew_id
into t_lastId, t_product_id,t_crew_id
from delays join line_reasons on delays.line_reason_id = line_reasons.id
where line_reasons.line = t_line order by delays.start_time desc limit 1;

我还应该提一下,因为我无法在主系统上创建触发器,所以我创建了一个基本上将这些值复制到events表中的作业:

id |  event_timestamp  |  event_value  | event_attr... |
 1    1/1/13 07:00            1            'event started'...
 2    1/1/13 07:05            2            'event ended'...

我的触发器在此events表上运行。

一个示例,显示了批量的外观以及插入因触发器失败的原因:

 |      datetime      | tagname | value |
    1/1/13 07:40:10       tag       1
    1/1/13 07:41:05       tag       1
    1/1/13 07:40:45       tag       0

正如您所看到的那样,未按正确的时间顺序插入批量,提供此输出:

 |   id   |  start_time     |     end_time      |   duration  |   uptime  | reason
   event1   1/1/13 07:40:10    1/1/13 07:40:10          5             0       xxx
   event2   1/1/13 07:41:05    1/1/13 07:40:45         -20s          55s     yxy

更新

我再也看不出原因为什么持续时间和正常运行时间应该是我表格中的存储值。动态计算它们将简化许多工作。

1 个答案:

答案 0 :(得分:1)

我不知道我是否理解得很好,但是

WHERE end_datetime > start_datetime

对你有帮助吗?

用这种方式你将不会匹配相等或负面的时间。