2017-07-26 49 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