postgresql 触发器如何生成递增序列号,从1开始,并且每天重置
大家好,我是三叔,许久不见,这期给大家介绍一下笔者在开发中遇到的业务处理:pgsql 创建触发器生成每日递增序列,并且第二天重置,根据不同的用户进行不同的控制。
1.创建生成递增序列的 table 表
-- 创建user_sequences表,用于保存生成的序列号
CREATE TABLE user_sequences
(id serial,user_name varchar(255) NULL, -- 区分不同用户(可根据不同业务组装key)increment_value int4 NULL, -- 递增序列号last_increment_date timestamp NULL, -- 触发器参数时间description varchar(255) NULL, -- 描述tenant_id varchar(32) NULL, -- 租户IDcreate_user varchar(32) NULL, -- 创建人IDcreate_time timestamp(6) NULL DEFAULT CURRENT_TIMESTAMP, -- 创建时间update_user varchar(32) NULL, -- 最后修改人IDupdate_time timestamp NULL DEFAULT CURRENT_TIMESTAMP, -- 更新时间CONSTRAINT user_sequences_pk PRIMARY KEY (id)
);
2.创建一个触发器函数
要创建一个触发器,你需要:
1、使用 create function 语句创建一个触发器函数
2、使用 create trigger 语句将触发器函数绑定到数据表
3、创建触发器函数语法:
触发器函数与普通函数类似,不同之处在于触发器不需要任何参数,并且触发器函数需要返回trigger类型值
-- 创建触发器函数
CREATE OR REPLACE FUNCTION insert_increment_value_if_not_exists()
RETURNS TRIGGER AS $$
BEGIN-- 检查 user_sequences 表中是否存在对应的 user_nameIF NOT EXISTS (SELECT 1 FROM user_sequences WHERE user_name = NEW.user_name) THEN-- 在 user_sequences 表中插入新的记录RETURN NEW;else UPDATE user_sequencesSET increment_value = increment_value + 1WHERE user_name = NEW.user_name; END IF;RETURN null;
END;
$$ LANGUAGE plpgsql;
上述部分语法解释
NEW:该变量为 INSERT/UPDATE 操作触发的行级触发器中存储新的数据行
3.创建触发器
-- 这里介绍一下创建触发器语法(如下简单语法):
create trigger trigger_name{before | after | instead of} event1 or event2...on table_name{for each row | for each statement}execute procedure trigger_function;event1: 事件可以是:insert, update, delete, truncate
before: 表示定义触发器在事件之前
after: 表示定义触发器在事件之后
intead of: 表示仅用于视图的insert, update, delete
for each row:表示行级触发器
for each statement:表示语级触发器
实际业务逻辑如下:笔者在插入表数据的时候触发执行器执行begin -》end 的 sql 逻辑,这样,我就能在每天对不同的用户,生成一个从1开始的递增序列,每次相同用户同一天访问一次,序列递增加1:
CREATE TRIGGER insert_increment_value_trigger
BEFORE INSERT ON user_sequences
FOR EACH ROW
EXECUTE FUNCTION insert_increment_value_if_not_exists();
4.业务处理逻辑
大家可以看到,在创建触发器的时候,有这么一句语法:BEFORE INSERT ON user_sequences,这句话是什么意思呢?
根据上面的触发器语法介绍可以知道,在每次执行 insert 语句之前,会执行触发器里面的语法。
@Service
public class xxxCommon {@Autowiredprivate TableMapper mapper;@Transactional(rollbackFor = Exception.class)public String getSequencesNum(String userName) {// 需要注意的是这里的userName需要保证唯一,可以拼接时间yyyyMMdd,这样可以保证每天获取新的递增序列// 第二种方法,就是在笔者的基础上,添加时间的判断条件,判断上一次修改或生成数据的时间是否不等于当前时间,如果是的,则重新从1开始递增UserSequencesVO vo = new UserSequencesVO();assembleParam(vo);vo.setIncrementValue(1);vo.setUserName(userName);// 触发器触发条件,insert 语句进行触发,这里我在xml里面写了一条新增的sql语句,从而触发触发器mapper.insertTriger(vo);// 这里获取数据库返回的序列号,UserSequencesVO sequencesVO = UserSequencesMapper.selectByUserName(userName);// 根据自己的业务组装返回值return sequencesVO.getIncrementValue();}private void assembleParam(UserSequencesVO vo) {vo.setDescription("获取当前key的递增序列");vo.setTenantId(userUtil.getTenantId());vo.setLastIncrementDate(LocalDateTime.now());vo.setCreateTime(LocalDateTime.now());vo.setCreateUser(userUtil.getId());vo.setTenantId(userUtil.getTenantId());vo.setUpdateTime(LocalDateTime.now());vo.setUpdateUser(userUtil.getTenantId());}
}
业务处理
在拿到递增的序列号之后,就可以对序列号进行一系列的组装操作,这样,根据不同的用户,互不影响,获取从 1 开始递增的序列号,并且第二天重置
结果如下:
笔者成功获取到每天操作文档的次数:

最后:如何删除触发器
DROP TRIGGER [ IF EXISTS ] name ON table_name [ CASCADE | RESTRICT ]
参数说明:
IF EXISTS:如果该触发器不存在
name:要移除的刚刚定义的触发器的名称
table_name:定义了该触发器的表的名称
CASCADE:自动删除依赖于该触发器的对象,然后删除所有 依赖于那些对象的对象
RESTRICT:如果有任何对象依赖于该触发器,则拒绝删除它,这是默认值
-- 示例
DROP TRIGGER insert_increment_value_trigger ON user_sequences;
相关文章:
postgresql 触发器如何生成递增序列号,从1开始,并且每天重置
大家好,我是三叔,许久不见,这期给大家介绍一下笔者在开发中遇到的业务处理:pgsql 创建触发器生成每日递增序列,并且第二天重置,根据不同的用户进行不同的控制。 1.创建生成递增序列的 table 表 -- 创建us…...
“第五十九天”
这是昨天那道题,这个后面自己的处理思路还是差了点,这道题关键感觉就是对进位的处理的,由于进位的存在,所以处理数据的时候只能从最低位开始,我一开始是从高位处理的,而且后面越来越迷,这个点一…...
IDEA集成Docker插件打包服务镜像与运行【附Docker命令汇总】
Docker官网 Docker官网:https://www.docker.com/ Docker Hub官网:http://hub.docker.com/ 什么是Docker Docker 是一个开源的容器引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者和系统管理员在笔记本上编…...
【Linux网络编程_TCP/UDP_字节序_套接字 实现: FTP 项目_局域网聊天项目 (已开源) 】.md updata:23/11/03
文章目录 TCP/UDP对比端口号作用字节序字节序转换api套接字 socket实现网络通讯服务端 逻辑思路demo: 满血版双方通讯/残血版多方通讯服务端 demo客户端 demo FTP 项目实现sever demo:client demo: 局域网多方通讯 配合线程实现sever demo:client demo: TCP/UDP对比…...
Leetcode刷题详解——全排列
1. 题目链接:46. 全排列 2. 题目描述: 给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1: 输入:nums [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],…...
JSONP 跨域访问(1), 简介, 原理, 实验, 缺点
JSONP 跨域访问(1), 简介, 原理, 实验, 缺点 一, JSONP 简介 JSONP(JSON with Padding)是一种非官方跨域数据交互协议。它允许web页面从不同的域名下加载数据。 由于同源策略,web页面通过XMLHttpRequest调用通常只允许访问与其自身相同域名…...
velero备份k8s集群
流程图 velero备份原理 本地 Velero 客户端发送备份指令。Kubernetes 集群内就会创建一个 Backup 对象。BackupController 监测 Backup 对象并开始备份过程。BackupController 会向 API Server 查询相关数据。BackupController 将查询到的数据备份到远端的对象存储。 velero的…...
描述低轨星座的特点和通信挑战,以及它们在5G和B5G中的作用。
文章目录 2章4 章5章(没看)6章(没看) 2章 将卫星星座中每个物理链路中可实现的数据速率、传播延迟和多普勒频移与3GPP技术报告中的参数进行分析和比较[3]。 相关配置 面向连接的网络,预先简历链路 卫星和地面终端有…...
Spring Boot实践 --windows环境下 K8s 部署 Docker
第一步:搭建项目并制作合适的jar包 这里我们准备好前面项目 用户管理系统 项目里的jar包。测试功能,定时任务会每过10s打印一次日志: E:\test>java -jar demospringboot-0.0.1-SNAPSHOT.jar2023-11-01 20:24:21.059 INFO 11848 --- [ …...
Linux 将Qt程序打包为AppImage包
前言 在 Linux 环境下,开发完 Qt 程序后,也需要制作为一个安装包或者可执行文件进行分发。这里介绍使用 linuxdeployqt 将 Qt 程序打包为 .AppImage 应用程序(类似于 Windows 的绿色免安装软件) 环境配置 配置 Qt 环境变量 这…...
修复国产电脑麒麟系统开机出现initramfs 问题
目录预览 一、问题描述二、原因分析三、解决方案四、知识点呀initramfsBusyBox 五、参考链接 一、问题描述 国产麒麟系统出现 initramfs 模式 二、原因分析 一般在拷贝卡顿过程【强制关机】或者电【脑异常断电】的情况下概率性导致系统分区损坏,重启后大概率就会进…...
机器人控制算法—如何使用C++读取pgm格式的栅格地图并转化为ROS地图格式的data?
1.Introduction 近期正在做全局规划局部动态规划的项目,目前遇到的问题是,我们如何利用C处理pgm地图文件。即将地图信息要与像素点结合起来。所以我们需要知道地图读取和处理的底层原理,这样更好地在非ROS平台下移植。 2.Main 如下几条信息…...
牛客项目(五)-使用kafka实现发送系统通知
kafka入门以及与spring整合 Message.java import java.util.Date;public class Message {private int id;private int fromId;private int toId;private String conversationId;private String content;private int status;private Date createTime;public int getId() {retur…...
计算机网络——第一章时延部分深入学习、相关习题及详细解析
目录 时延相关 习题1 习题1-改 习题2 时延相关 之前我们学习过,时延由发送时延、传播时延和处理时延三部分构成。 发送时延的计算公式为“分组长度除以发送速率”, 发送速率应该从网卡速率、信道带宽、以及对端的接口速率中取最小。 传播时延的计…...
CSS3媒体查询与页面自适应
2017年9月,W3C发布媒体查询(Media Query Level 4)候选推荐标准规范,它扩展了已经发布的媒体查询的功能。该规范用于CSS的media规则,可以为文档设定特定条件的样式,也可以用于HTML、JavaScript等语言。 1、媒体查询基础 媒体查询…...
UG\NX二次开发 超长的对象属性值,怎么设置
文章作者:里海 来源网站:里海NX二次开发3000例专栏 感谢粉丝订阅 感谢 Dr. Lin 订阅本专栏,非常感谢。 简介 使用UF_ATTR_assign设置对象属性,如果属性值超过UF_ATTR_MAX_STRING_LEN则会报错。 #define UF_ATTR_MAX_STRING_LEN 132 怎么办呢?下面这种方法可以解决: 效果 …...
流媒体服务实现H5实时预览视频
目录 背景方案业务实践细节注意 待办 背景 客户aws服务磁盘存储告急,最高可扩容16T。排查如下:主要是视频文件存在大量复制使用的情况。例如发布节目时复制、预览时复制,这样上传一份视频后最大会有四份拷贝(预览、普通发布、互动…...
C++适配器
文章目录 引言栈和队列 priority_queue仿函数迭代器区间 引言 栈的特性是先进后出,队列的特性是先进先出,然而双向队列同时具有栈和队列的特性,所以我们可以通过双向队列来适配出栈和队列。 先看库里面 栈和队列 stack和queue模板参数里面都…...
基于openresty waf二次开发多次匹配到的ip再做拉黑
我们想在openresty waf的基础上做二次开发,比如再精确一些。比如我们先匹配到了select的url我们先打分10分,匹配到cc 1000/s我们再给这个ip打10分…直到100分我们就拉黑这个ip。 [openresty waf][1] #cat reids_w.lua require lib local redis require…...
新一代构建工具Vite-xyphf
一、什么vite? vite:是一款思维比较前卫而且先进的构建工具,他解决了一些webpack解决不了的问题——在开发环境下可以实现按需编译,加快了开发速度。而在生产环境下,它使用Rollup进行打包,提供更好的tree-shaking、代码压缩和性能优化&…...
实在 Agent 和通用大模型有什么不一样?深度拆解 AI Agent 的感知、决策与执行逻辑
获取系统时间这一任务,虽然看似简单,却深刻揭示了 AI Agent 与通用大模型在本质、能力、架构和应用场景上的根本性差异。通用大模型(LLM),如 GPT、Claude 或通义千问等,其核心是基于海量文本数据训练出的概…...
Python扩展模块发布即弃坑?PyPI审核新规+manylinux2014/2023+musllinux多目标轮子构建全流程(含CI/CD自动化脚本)
第一章:Python扩展模块发布即弃坑?PyPI审核新规manylinux2014/2023musllinux多目标轮子构建全流程(含CI/CD自动化脚本)PyPI自2023年起强化了对二进制轮子(wheel)的合规性审查,尤其针对C/C扩展模…...
三步搞定全网资源下载:手把手教你使用res-downloader网络资源嗅探工具
三步搞定全网资源下载:手把手教你使用res-downloader网络资源嗅探工具 【免费下载链接】res-downloader 资源下载器、网络资源嗅探,支持微信视频号下载、网页抖音无水印下载、网页快手无水印视频下载、酷狗音乐下载等网络资源拦截下载! 项目地址: http…...
开源工具权限重置指南:跨平台AI编程助手试用限制解决方案
开源工具权限重置指南:跨平台AI编程助手试用限制解决方案 【免费下载链接】go-cursor-help 解决Cursor在免费订阅期间出现以下提示的问题: Youve reached your trial request limit. / Too many free trial accounts used on this machine. Please upgrade to pro. …...
医疗工作者的AI助手:MedGemma在症状鉴别诊断中的实战应用
医疗工作者的AI助手:MedGemma在症状鉴别诊断中的实战应用 1. 医疗AI的新范式:透明化诊断推理 在繁忙的临床工作中,医生们常常面临这样的挑战:如何在有限时间内准确识别症状组合背后的病因?传统方法依赖个人经验记忆和…...
别只背概念了!用这5个真实安全场景,带你重新理解CISSP核心模型(附实战案例)
别只背概念了!用这5个真实安全场景,带你重新理解CISSP核心模型(附实战案例) 当安全团队复盘某跨国电商的数据泄露事件时,发现攻击者竟是通过供应链系统中的第三方插件漏洞,绕过了价值千万的防火墙体系。这个…...
【极简监控】告别重度存储!用 InMemoryMetricsCollector 搞定 99% 的单体应用Metrics排错
文章目录前言破局:断舍离,只关注“最近半小时”极简利器:InMemoryMetricsCollector 的设计哲学它是如何工作的?注入灵魂:结合 AI 的智能可视化结语与延伸相关前言 做系统监控这么多年下来,我们团队常常在反…...
Umi-OCR PDF文字识别全攻略:从技术原理到实战应用
Umi-OCR PDF文字识别全攻略:从技术原理到实战应用 【免费下载链接】Umi-OCR Umi-OCR: 这是一个免费、开源、可批量处理的离线OCR软件,适用于Windows系统,支持截图OCR、批量OCR、二维码识别等功能。 项目地址: https://gitcode.com/GitHub_T…...
效率飞跃:用快马一键配置wsl2下的全能开发工具链
效率飞跃:用快马一键配置wsl2下的全能开发工具链 最近在Windows上折腾WSL2开发环境,发现从零开始配置各种工具链特别耗时。每次换电脑或重装系统,都要重复安装一堆基础工具、配置环境变量、调试兼容性问题。后来尝试用InsCode(快马)平台生成…...
5分钟部署Llama Factory:开箱即用的大模型训练平台
5分钟部署Llama Factory:开箱即用的大模型训练平台 1. 为什么选择Llama Factory 在人工智能领域,大型语言模型(LLM)的微调和训练一直是技术门槛较高的工作。传统方法需要编写大量代码、处理复杂的环境配置,并且对硬件资源要求极高。Llama F…...
