如何创建执行插入操作的更新触发器?

时间:2017-07-07 10:14:44

标签: mysqli triggers insert updates

下面考虑我的表,

register_device

id | user_id | device_id | status | 

1  |  12     |  1234      |   1    | 
2  |  1      |  5678      |   1    | 
3  |  11     |  1456      |   1    |

触发逻辑:

在register_device表中插入值之前,我想检查register_device表中是否已存在新的device_id值。如果值已经存在,则在插入新值之前,需要将其状态更改为0,如下所示。

id | user_id | device_id | status | 

1  |  12     |  1234      |   0    | 
2  |  1      |  5678      |   1    | 
3  |  11     |  1456      |   1    |
4  |  14     |  1234      |   1    |

因此,当我通过编码运行插入操作时,触发器需要在数据库中自己执行上述逻辑。

1 个答案:

答案 0 :(得分:0)

由于以下几个原因,您当前的方法将很难实现插入逻辑:

  • 您无法使用触发器,因为触发器无法修改导致其触发的表
  • 使用<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>也不会飞,因为即使更新也发生,您实际上也想要插入记录

我提出了一个略有不同的表格设计:

ON DUPLICATE KEY UPDATE

此处唯一的变化是id | user_id | device_id | status_timestamp 已成为status,这是status_timestamp列。您可以插入记录并使用timestamp作为当前时间戳值。

从逻辑上讲,任何的记录对于给定NOW()的最大值status_timestamp都会对应原始表中的零device_id 。具有给定status的最大status_timestamp值的记录将对应于device_id的1。

例如,要获取status 1234的status = 1记录,您可以使用以下查询:

device_id

要获得SELECT * FROM register_device WHERE device_id = 1234 ORDER BY status_timestamp DESC LIMIT 1 1234的所有状态= 0记录,您可以使用:

device_id