我有一种情况,我们将用户拥有的信用值存储在数据库中:
`credits` DOUBLE(22,2) UNSIGNED NOT NULL DEFAULT '0.00',
学分是从 1 到任何正值的数字。但是现在有一种情况,我们要按月给用户扣积分,我看到一个情况,用户在SQL查询的时候可能是0积分。
处理这个问题的最佳做法是什么?我知道允许负数会产生很多错误和漏洞,但我们确实需要实现一些东西
例如:每个月的最后一天,我们将从所有用户中扣除 -1 积分。我使用 mariadb 10.6.11,但如果有帮助,可以升级到更高版本
如果您希望防止值低于某个负值,那么您可以使用检查约束:
如果你尝试在下面插入一个值,它会失败并抛出错误:
您可以编写一个触发器来执行类似的操作,或者编写一个触发器来动态修复正在插入或更新的值。但是,我认为最好的做法是在可以选择时使用检查约束而不是使用触发器。然后让您的应用程序处理每当用户试图违反约束时从数据库系统抛出的任何错误。
触发器有一些局限性,也被一些人视为维护噩梦。另请参阅MariaDB 的触发器限制列表。
这会减
foo
1,但会阻止结果低于 -10。(也许这个微不足道的代码就是您要找的?)(LEAST()
与之对应。)如果要存储并四舍五入到小数点后两位,请不要使用
FLOAT
或。DOUBLE
取而代之的是DECIMAL(11,2)
,例如,允许值高达 10 亿并且有 2 个小数位。(与 一样DOUBLE
,DECIMAL
是“签名的”。)至于控制限制——需要应用程序解决方案,而不是数据库解决方案。但是,请参阅
TRIGGER
和/或作为将业务STORED PROCEDURE
逻辑封装在 SQL 中的方法。这
UPDATE
是可能的,但如果你有 10 亿用户,那将是痛苦的缓慢。(如果你需要讨论那个,写一个只关注那个的问题。)