2017-07-07 47 views
1

考虑下面是我的表,如何在执行插入操作时创建更新触发器?

register_device 

id | user_id | device_id | status | 

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

逻辑触发:

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

id | user_id | device_id | status | 

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

所以,当我通过编码运行插入操作,触发需要通过自己的数据库来执行上述逻辑。

+0

这将是很难做到的。你不能使用'ON DUPLICATE KEY UPDATE',因为你实际上想要插入一条记录,而且你也不能使用触发器。 –

+0

你能否为此逻辑建议任何其他方法。 –

+0

如果_same_用户试图插入_same_'device_id',应该失败还是应该允许? –

回答

0

您当前的做法是要使它很难实现您的插入逻辑有以下几个原因:

  • 不能使用触发器,因为触发器不能修改造成它开火
  • 使用ON DUPLICATE KEY UPDATE也不会飞,因为你确实要插入的记录,即使更新也恰好

我提出了一个稍微不同的表设计:

id | user_id | device_id | status_timestamp 

这里唯一的变化是status已成为status_timestamp,这是timestamp列。您可以插入记录并使用NOW()作为当前时间戳值。

按道理讲,这确实不任何记录有status_timestamp对于给定device_id最大值将对应于零status在原始表。和记录具有用于给定device_id最大status_timestamp值将对应于status 1.

例如,要获得状态= 1个记录device_id 1234,你可以使用以下查询:

SELECT * 
FROM register_device 
WHERE device_id = 1234 
ORDER BY status_timestamp DESC 
LIMIT 1 

并获得device_id 1234的所有状态= 0记录,您可以使用:

SELECT * 
FROM register_device 
WHERE device_id = 1234 AND 
     status_timestamp < (SELECT MAX(status_timestamp) FROM register_device 
          WHERE device_id = 1234) 
相关问题