2017-07-26 48 views
1

我有一個這樣的查詢:如何保護無符號列防止負數?

UPDATE users SET reputation = reputation - 2 WHERE id = :id 

它有時拋出一個錯誤,當電流reputation0。由於reputation列是unsigned。有什麼想法我該如何解決這個問題?

回答

1

使用GREATEST()

UPDATE users SET reputation = GREATEST(reputation - 2, 1) WHERE id = :id 

如果reputationzerofill,然後​​。

1

您可以使用CASE WHEN設定值,如果它是一個正值或負值的默認值:

UPDATE users 
SET reputation = (CASE WHEN (reputation - 2 >= 0) THEN reputation - 2 ELSE 0 END) 
WHERE id = :id 

您可以在ELSE部分設置默認值,如果該值低於0(在這種情況下爲0)。


由於@stack在他的答案已經提到的,你可以使用GREATEST(而不是CASE WHEN):

UPDATE users 
SET reputation = GREATEST(reputation - 2, 0) 
WHERE id = :id 

如果你不想UPDATE在這種情況下,您可以檢查WHERE上的值:

UPDATE users 
SET reputation = reputation - 2 
WHERE id = :id 
    AND (reputation - 2) >= 0