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、代码压缩和性能优化&…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...
LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...
解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...
