sql-扣除列值直到非负值

but5z9lq  于 2021-06-17  发布在  Mysql
关注(0)|答案(3)|浏览(394)

我正在处理一个表,其中有一个int列,当某个事件发生时,该列将被扣除。该值是预先确定的,不能低于零。
将有大量并发sql事务从数据库中声明值。它只是一个柜台,就像音乐会门票是怎么预订的。
目前,我的逻辑不能保证它以有效的方式保持在0以上(更新前选择不能保证:())。有什么诀窍来执行这个商业规则吗?
如果值不足,则事务不应通过。

ltqd579y

ltqd579y1#

好像你需要某种锁紧装置。
该功能在mysql中可用:
innodb表实现行级锁定-请参阅此文档
isam只提供表级锁定

fafcakar

fafcakar2#

解决方案1-使用无符号

ALTER TABLE events MODIFY event_count INT UNSIGNED NOT NULL

试图降低到0以下将导致错误。
解决方案2-使用查询

UPDATE events SET event_count=event_count-1 WHERE event_id={X} AND event_count > 0

查看受影响的行,看看是否发生了这种情况。

mkshixfv

mkshixfv3#

您可以探索mysql的check约束。它将确保列值永远不会低于零,也不需要使用sql代码验证计数器。
示例表定义:-

CREATE TABLE IF NOT EXISTS events (
    event_count DECIMAL(10 , 2 ) NOT NULL CHECK(cost >= 0),
    price DECIMAL (10,2) NOT NULL
);

相关问题