2017-07-07 93 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) 
相關問題