我有一個這樣的觸發器,它將總價值保留在父表中:
UPDATE posts p SET total_comments = GREATEST(total_comments - 1, 0) WHERE old.post_id = p.id
我曾經GREATEST()避免使用負數,但如果當前值為total_comments is0然后觸發器執行,我仍然會收到此錯誤:
#1690 - BIGINT UNSIGNED 值超出范圍 (mydb.p.total_comments - 1)
有什么解決辦法嗎?
uj5u.com熱心網友回復:
怎么樣使用where條款,以避免更新它,如果它已經0。試試這個:
UPDATE posts p
SET total_comments = total_comments - 1
WHERE old.post_id = p.id
AND total_comments > 0
uj5u.com熱心網友回復:
從超出范圍和溢位處理:
默認情況下,整數值之間的減法(其中一個是 UNSIGNED 型別)會產生一個無符號結果。如果結果否則為負,則會導致錯誤
在你的情況下total_comments被定義為UNSIGNED,如果它的值是0那么運算式的評估total_comments - 1會引發錯誤。
一種解決方法是在total_comments內部GREATEST()與1進行比較,然后進行減法運算:
UPDATE posts p
SET total_comments = GREATEST(total_comments, 1) - 1
WHERE old.post_id = p.id
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/400248.html
