MySQL 如何让一个字段的值不能被减为负数

当用数据库存储一个数值,并且这个数值需要被增减的时候,比如物品的数量。

在这种场景下,物品的数量是不能为负数的。那如何确保在扣减这个数量的时候,不会被扣成负数呢。

假设表数据如下:

skunum

a10

b20

假设现在 a 的 num 要 减少10个。

用程序在操作之前判断? num 是否足够扣减 ? 这明显是不靠谱的。因为有并发的情况存在。

在并发的情况下,a 的 num 会变成 -10 当然,前提你的 sql 是这么写的:

UPDATEtableSETnum=num-10WHEREsku="a"

绝对不能用程序去计算 num 的值,在赋值到 sql 中,在并发情况下  num 会变成 0,错误示例:

$data ='select * from table where sku="a"';$num =$data['num'] -10;UPDATEtableSETnum=$numWHEREsku="a"

所有的方案必须有正确的操作 sql 也就是,第一种 sql。

方案1:

利用数据库的事务,

在 update  的 sql 执行完成后,select num 的值判断是否小于0,如果小于,回滚。

方案2:

更改 num 字段的属性,无符号整形。

即字段属性中的  UN,Unisigned

参考 sql :

ALTERTABLE`table`CHANGECOLUMN`num``num`INT(11)UNSIGNEDNOTNULLDEFAULT'0';

这种情况下,当 num 被减成负数的时候,数据库会返回错误。

Error Code:1690. BIGINT UNSIGNED valueisoutofrangein......


我自己测试的实例:



附上一张Mysql字段属性:


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容