MariaDB 10.5.x,让计数字段具有自我修复功能,减少数据不一致

文章表

CREATE TABLE `article` (

`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',

`title` varchar(100) NOT NULL DEFAULT '' COMMENT '标题',

`content` varchar(5000) NOT NULL DEFAULT '' COMMENT '内容',

`like_count` int(10) unsigned DEFAULT 0 COMMENT '点赞数',

`time` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp() COMMENT '创建时间',

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='文章表';

INSERT INTO `article` VALUES (1,'SnnGrow社区','SnnGrow 社区是以类脑芯片和类脑人工智能算法及其应用为主的行业综合网站,包含芯片及算法相关资讯、开源平台、资源导航以及技术论坛,提供完整、高效、优质内容的专业技术网站。',0,'2022-08-04 10:20:23');

加:计数增加

SQL01:UPDATE article SET like_count = like_count + 1 WHERE id =1

减:计数减少

SQL02:UPDATE article SET like_count = like_count - 1 WHERE id =1

加减合并

SQL03:UPDATE article SET like_count = like_count + #{num} WHERE id =1

当 #{num}是负数时,就是计数较少;当 #{num} 是整数时,就是计数增加。

优化减法

like_count字段的取值范围应该是大于等于 0,在表定义时,已将本字段设置为无符号整数。

在执行 SQL03 时,若 like_count + #{num} 小于 0,则本语句会报错。

计数未同步(情况举例:手动修改,或多条语句只正确执行了一部分)会造成 like_count 的值与点赞记录不一致,或大于或小于。

这时,我们可以对SQL进一步优化,如下:

SQL04:UPDATE article SET like_count = like_count + #{num} WHERE id =1 AND like_count >= -#{num}

当 like_count值 为 0 时,若再执行计数减少操作,则 SQL04 可以正常执行;执行后 like_count值趋近于或等于实际值。

优化过量减法

SQL04 语句还存在一个问题:当 like_count值为 5,#{num}为 -8 时,执行 SQL04 后,like_count值仍然为 5。

此时,我们更希望 like_count值变为 0。要满足这一要求,需要引入 CASE WHEN 关键字,如下:

SQL05:UPDATE article SET like_count = CASE WHEN like_count >= -#{num} THEN like_count + #{num} ELSE 0 END WHERE id = 1

在阅读以上内容时,若遇到问题,可以随时私信本人。(https://www.snngrow.com)

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章