2017-01-30 97 views
1

我有一張包含兩列的表。在這個例子中,我刪除了一些額外的列。實際上有5個其他欄。帶更新值的MySQL更新行

  • DIR
  • MSGNUM

據填充像這樣:

msgnum dir 
0   /var/spool/asterisk/voicemail/test/1/INBOX 
1   /var/spool/asterisk/voicemail/test/1/INBOX 
2   /var/spool/asterisk/voicemail/test/1/INBOX 
3   /var/spool/asterisk/voicemail/test/1/INBOX 
4   /var/spool/asterisk/voicemail/test/1/INBOX 
5   /var/spool/asterisk/voicemail/test/1/INBOX 
0   /var/spool/asterisk/voicemail/test/1/Old 
1   /var/spool/asterisk/voicemail/test/1/Old 
0   /var/spool/asterisk/voicemail/test/2/INBOX 
1   /var/spool/asterisk/voicemail/test/2/INBOX 

注意MSGNUM不是唯一的。每個'dir'值都是獨一無二的。

刪除記錄時,我想重新計算並更新每行的msgnum字段,並保留msgnum的順序。因此,如果刪除了msgnum = 3的記錄,則msgnum 4和5會更新爲「將它們移動」。

是否有可能在純MySQL中做到這一點?

感謝

回答

0

您可以使用triggers來實現這一目標。 在你的表格中,轉到更多 - >觸發器,並選擇觸發時間,在這種情況下:AFTER-DELETE,然後編寫你的SQL。防爆。

UPDATE table SET msgnum = msgnum-1 WHERE msgnum > OLD.msgnum 

其中OLD.msgnum將被刪除的msgnum。

對不起,我英文不好

+0

此解決方案未考慮'dir'字段。請注意,msgnum不是唯一的。每個'dir'值都是獨一無二的。 –

+1

@Dan_J如果你不知道你的問題,應該怎麼知道?但是 - 您可以添加條件'AND dir = OLD.dir' –

+0

@Paul它在示例數據中顯示。 –

0

既然你已經通過PHP執行SQL,我會回答基於這一點。

你需要爲了執行低於2個sql語句的數據庫事務裏

delete from mytable where msgnum = 3; 
update mytable set msgnum = msgnum - 1 where msgnum > 3; 

你需要做這樣的交易中,這樣,如果更新失敗,您可以安全地回滾也刪除。

+0

我無法運行更新,直到進一步處理完成。多於一行可以被刪除。 –

+0

delete sql將刪除所有匹配msgnum的行作爲3.您可以在刪除和更新sqls之間執行一些其他處理,但要確保所有內容都在事務中。 – Rajesh

+0

不幸的是,由於應用程序的性質,我不能把所有東西都放到一個事務中。我需要一種方法來運行一個SQL腳本,該腳本會在刪除某些記錄後更新該「dir」的所有msgnum值。請注意,此PHP腳本已連接到Asterisk並在運行時收到反饋。 –