如何保护未签名的列免受负数的影响?

时间:2017-07-26 06:39:06

标签: mysql sql

我有这样的查询:

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

当前reputation0时,有时会抛出错误。由于reputation列为unsigned。有什么想法我怎么解决这个问题?

2 个答案:

答案 0 :(得分:1)

您可以使用CASE WHEN设置值,如果它是正值或默认值为负值:

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

如果值小于0(在本例中为ELSE),您可以在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

答案 1 :(得分:1)

使用GREATEST()

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

如果reputationzerofill,那么GREATEST(reputation - 2, 0)