postgresql 触发器如何生成递增序列号,从1开始,并且每天重置

news2024/12/25 16:41:31

大家好,我是三叔,许久不见,这期给大家介绍一下笔者在开发中遇到的业务处理: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,                            -- 租户ID
    create_user               varchar(32) NULL,                            -- 创建人ID
    create_time               timestamp(6) NULL DEFAULT CURRENT_TIMESTAMP, -- 创建时间
    update_user               varchar(32) NULL,                            -- 最后修改人ID
    update_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_name
  IF NOT EXISTS (
    SELECT 1 FROM user_sequences WHERE user_name = NEW.user_name
  ) THEN
    -- 在 user_sequences 表中插入新的记录
    RETURN NEW;
  else 	 
	UPDATE user_sequences
    SET increment_value = increment_value + 1
    WHERE 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 {

    @Autowired
    private 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;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1163414.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

新手必看的Facebook广告投放基础思路

一、广告账号要求 如果您还没有Facebook账号,那么第一步是准备Facebook账号。 1、配置正确的网络环境 Facebook账号需要在稳定安全的网络环境中运行,否则很容易导致封禁。像我们常用的是Maskfog指纹浏览器,可以通过自定义浏览器指纹与为环…

计算机网络第4章-网络层(1)

引子 网络层能够被分解为两个相互作用的部分: 数据平面和控制平面。 网络层概述 路由器具有截断的协议栈,即没有网络层以上的部分。 如下图所示,是一个简单网络: 转发和路由选择:数据平面和控制平面 网络层的作用…

Plist编辑软件 PlistEdit Pro mac中文版功能介绍

PlistEdit Pro mac是一款功能强大的Plist文件编辑软件。Plist文件是苹果公司开发的一种XML文件格式,用于存储应用程序的配置信息和数据。PlistEdit Pro可以帮助用户轻松地编辑和管理Plist文件。 PlistEdit Pro具有直观的用户界面和丰富的功能。用户可以使用该软件打…

【计算机网络】网络层——IP

目录 1.概念2.协议格式3.网络划分ip组成IP地址分类IP地址数量私网IP和公网IP子网掩码路由 1.概念 引入 应用层http协议是进行构建和解析请求request和响应response。 传输层的TCP/UDP协议是不提供数据的运输。传输层是为数据传输指定规则。但是,UDP协议并不保证数…

Java八大排序——归并排序

1.什么是归并排序 归并排序是一种基于分治思想的排序算法,它将待排序的序列分成若干个子序列,每个子序列都是有序的,然后再将这些有序的子序列合并成一个有序的序列。归并排序的时间复杂度为O(nlogn),是一种稳定的排序算法。除了排…

数据分析和用户个性化体验:开发同城外卖APP的技术解决方案

在数字化时代,外卖服务已经成为人们日常生活中不可或缺的一部分。无论是忙碌的白领、学生,还是家庭主妇,都倚赖同城外卖APP来方便地满足他们的饥饿需求。然而,随着竞争的激烈,外卖APP必须不断改进,以满足用…

ajax调用springboot后台接口

工具 api测试工具 由于后台接口不是同一个团队编写的,在文档缺失的情况下,需要测试后台接口接收参数类型,可以使用这个工具,注册很方便 页面如下所示,可以选择请求方法是get,或者post 重点介绍两种&…

SpireCV如何利用TensorRT加速?

TensorRT简介 TensorRT是NVIDIA推出的一款高性能的深度学习推理引擎(C库)。相比于一般的深度学习框架,在GPU模式下其可提供36X的加速,极大提高了深度学习模型在边缘设备上的推断速度,以满足无人机、无人车等无人系统的快速视觉检测场景。 Te…

Google play开发者账号隔离用指纹浏览器还是vps?哪个防关联效果更佳?

很多谷歌安卓开发者会通过矩阵、马甲包的方式,在Google play应用商店上获得更多的流量和收益,这需要多个开发者账号,因此开发者账号隔离问题的重要性不言而喻。 在Google play开发者账号的隔离防关联问题上,使用vps和指纹浏览器是…

Oracle(12)Managing Indexes

目录 目标: 一、基础知识 1、Classification ofindexes 索引的分类 2、B-Tree vs Bitmap 3、Creating Indexes: Guidelines 创建索引:准则 4、Offline Index Rebuild 脱机索引重建 5、RebuildingIndexes 重建索引 6、Online Index Rebuild 在线索引重建 7…

记一次某学院的未授权渗透过程

文章现写的,部分内容有些着急。 0x01 测试过程 开局登录框,没有测试SQL注入与XSS(菜鸟,测也测不出来。) 有system用户,尝试弱口令,无果! 直接namp来一下子端口探测吧 发现有3306与8888 3306 mysql测试…

《Generic Dynamic Graph Convolutional Network for traffic flow forecasting》阅读笔记

论文标题 《Generic Dynamic Graph Convolutional Network for traffic flow forecasting》 干什么活:交通流预测(traffic flow forecasting )方法:动态图卷积网络(Dynamic Graph Convolutional Network)…

【沧元图】梅元知命运逆转,但遗憾下线,孟川新形态揭晓

Hello,小伙伴们,我是小郑继续为大家深度解析国漫资讯。 深度爆料,《沧元图》是近年来备受期待的动画作品之一,其独特的画风和精彩的剧情吸引了众多观众的关注。这部动画的播出计划备受瞩目,据主创团队透露,本季共有26…

关于GPT的一些使用场景

与传统的机器翻译或语音识别技术不同,GPT强调的是生成新文本的能力,这使得它在创作、摘要、问答等场景下具有独特的优势。下面是我日常生活中用到GPT的一些场景: 日常闲聊 在日常闲聊中(尤其是和运营xjj聊天的时候)&a…

伊朗网络间谍组织针对中东金融和政府部门

导语 近日,以色列网络安全公司Check Point与Sygnia发现了一起针对中东金融、政府、军事和电信部门的网络间谍活动。这一活动由伊朗国家情报和安全部门(MOIS)支持的威胁行为者发起,被称为"Scarred Manticore"。该组织被认…

【EI会议征稿】第四届机械、电子电气与自动化控制国际学术会议(METMS 2024)

第四届机械、电子电气与自动化控制国际学术会议(METMS 2024) 2024 4th International Conference on Mechanical, Electronics and Electrical and Automation Control 2024年第四届机械、电子电气与自动化控制国际学术会议(METMS 2024&am…

每日一练 | 网络工程师软考真题Day47

阅读以下关于Linux文件系统和Samba效劳的说明,答复以下【问题1】至【问题3】。 【说明】 Linux系统采用了树型多级目录来管理文件,树型结构的最上层是根目录,其他的所有目录都是从根目录生成的。通过Samba可以实现基于Linux操作系统的效劳器和…

C语言之for的执行顺序

1.for具有内部可以存放3个条件&#xff0c;比如for(int i 0&#xff1b;i < n&#xff1b;i )。for中的条件可以不写&#xff0c;但是符号“&#xff1b;”一定要存在。for(;;)的作用和while(1)是类似的&#xff0c;都是一种死循环。 对于for(int i 0;i < n;i)&#x…

vite安装Tailwind CSS

安装 - Tailwind CSS 中文网 (nodejs.cn) 这是官网&#xff0c;平常我练习一般会用vite脚手架 我们选择这个vite模块 可选择React和Vue版本的&#xff0c;这里选择react的按照操作&#xff0c;没问题的话就要出问题了 1、在npm run dev的时候我是出现了这么个问题&#xff0c…

ATFX汇市:美联储11月利率决议再暂停加息,紧缩货币政策或已接近尾声

ATFX汇市&#xff1a;11月美联储利率决议结果在今日2:00公布&#xff0c;其中提到&#xff1a;美联储寻求以2%的速度实现最大的就业和通胀率&#xff0c;为了达成这些目标&#xff0c;美联储决定将联邦基金利率的目标区间维持在5.25%~5.5%&#xff1b;委员会将会考虑货币政策的…