前言
近日一早上都在解決數據庫的問題,這是新遇到的一個報錯,特此記錄一下。
正文
背景:需要在sql中之間執行類似:
UPDATE {$table} SET point=point-{$point} WHERE `id`={$id}
突然發現要被減去的point的數目是大於數據庫中存儲的。不是前文沒做檢驗是因爲前文sql寫錯了,導致的這裏id錯了,所以扣到了一個已經被扣光的記錄(即point=0)裏頭,由於設置了unsigned,0-1肯定報錯。
出現了!
BIGINT UNSIGNED value is out of range
解決辦法:
1.不能接受取絕對值的解決方式:
UPDATE {$table} SET point=point-(IF(point>{$point}, {$point}, 0)) WHERE `id`={$id}
2.可以接受取絕對值得解決方式
UPDATE {$table} SET point=(abs(cast(point as signed)-{$point})) WHERE `id`={$id}