更新如果最后一条记录包含相同的值,则INSERT

时间:2016-06-26 10:09:35

标签: mysql sql database

我正在尝试在我的数据库中存储一些通知。我从一些机器接收GPS数据,我想在下一个场景中发出通知(在mysql中记录): 1.如果收到的gps数据是假的 - > " GPS数据错误" 2.如果gps坐标匹配某个区域 - > "机器位于区域XY" 3.如果gps坐标不匹配区域 - > "机器超出XY区域"

表格如下:

ID  MachineID     note        Datetime              FirstSignal
............................................................................
1         5       in zone     2016-06-25 18:13:40   2016-06-25 18:02:40      
2         5       gps error   2016-06-25 18:19:40   2016-06-25 18:14:40                
3         5       in zone     2016-06-25 18:23:40   2016-06-25 18:20:40
etc.

所以我想说我每分钟从机器获取数据。我想发这样的通知: 如果该机器的最后通知不是这样,则插入新通知:

INSERT into notifications (MachineID, note, Datetime, FirstSignal) VALUES (5, 'in zone', now(), now())

如果最后一个条目有相同的通知,我只想像这样上传:

UPDATE notifications SET Datetime=now()
WHERE ID = (SELECT MAX(ID) FROM notifications WHERE MachineID=5)

那么我如何将这两个查询结合起来呢?我知道INSERT或UPDATE查询的一个常见答案是有一个语法:INSERT ... ON DUPLICATE KEY UPDATE ...我必须用它来制作一个由' MachineID'组成的唯一密钥对。和#39;注意'。但这对我来说是不可接受的,因为我想保持同样的记录,例如几条参赛作品。我想我必须在笔记上使用一些IF条件,但我真的不知道如何。任何帮助表示赞赏。

修改 所以我想出了使用交易的想法。但是,我有一些语法错误,我似乎无法自己弄清楚。我试过这个:

IF (SELECT note FROM notifications 
    WHERE MachineID='$podatki[mid]' ORDER BY Datetime DESC LIMIT 1) = '$notification'
THEN 
     UPDATE notifications SET Datetime=now() 
     WHERE ID = (SELECT MAX(ID) FROM notifications WHERE MachineID='$podatki[mid]') 
ELSE 
     INSERT into notifications (0, MachineID, note, Datetime, FirstSignal) VALUES (0, '$podatki[mid]', '$notification', now(), now()) 
END IF;

我也尝试了这个:

IF EXISTS(SELECT * FROM notifications WHERE ID = (SELECT MAX(ID) FROM notifications WHERE MachineID='$podatki[mid]') AND note='$notification')
            THEN
            UPDATE notifications SET Datetime=now() WHERE ID = (SELECT MAX(ID) FROM notifications WHERE MachineID='$podatki[mid]')
            ELSE
            INSERT into notifications (0, MachineID, note, Datetime, FirstSignal) VALUES (0, '$podatki[mid]', '$notification', now(), now())
            END IF  

两者都收到错误:

 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF EXISTS(SELECT * FROM notifications WHERE ID = (SELECT MAX(ID) FROM notificati' at line 1     

1 个答案:

答案 0 :(得分:0)

前面的答案是正确的,IF语句只能在存储过程中工作(除非服务器实际上是最近的MariaDB而不是MySQL)。但假设它是在存储过程中,有两个缺少分号和一个迷路'0',一个语法更正确的语句看起来像

IF (SELECT note FROM notifications 
    WHERE MachineID='$podatki[mid]' ORDER BY Datetime DESC LIMIT 1) = '$notification'
THEN 
     UPDATE notifications SET Datetime=now() 
     WHERE ID = (SELECT MAX(ID) FROM notifications WHERE MachineID='$podatki[mid]') ;
ELSE 
     INSERT into notifications (ID, MachineID, note, Datetime, FirstSignal) VALUES (0, '$podatki[mid]', '$notification', now(), now()); 
END IF;