pg序列实现字段的自增

需求:某个公司的外协员工在新增的时候需要自动生成工号,规则为W+五位数字,例如W00001,W00002,以此类推,数据库用的pg数据库,我本来想着查询出所有外协员工的数据,然后order by拿到最新一条的数据然后拿到最新的那一条记录,获取到这一条的工号加一赋值给新的数据。

但是这样的问题就是用户表数据量很大,查询时间不够完美。而且依赖新增时间进行搜索就会有问题,因为会出现同时创建的记录这样就会出现问题。

所以我们可以使用pg的序列来实现这个需求,我们新增一个序列,让他从1开始,到9999999999结束,这样就可以对上我们的需求。

然后再通过JdbcTemplate来获取当前序列的值(一定要先注入JdbcTemplate)

java 复制代码
@Autowired
    private JdbcTemplate jdbcTemplate;

 if (createReqVO.getPersonType().equals("1")){
            // 外协员工:w + 5 位数字,不足补零
            int nextVal = jdbcTemplate.queryForObject(
                    "SELECT nextval('outsourcing_user_sn')", Integer.class);
            user.setUserSn("W" + String.format("%05d", nextVal));
        }

这样的话就可以获取到当前序列的值了,再通过"W" + String.format("%05d", nextVal)拼接成W+五位数字我们就大功告成啦!

展示一下我的全部新增代码,以供参考:

java 复制代码
@Override
    @Transactional(rollbackFor = Exception.class)
    @LogRecord(type = SYSTEM_USER_TYPE, subType = SYSTEM_USER_CREATE_SUB_TYPE, bizNo = "{{#user.id}}",
            success = SYSTEM_USER_CREATE_SUCCESS)
    public Long createUser(UserSaveReqVO createReqVO) {
        // 1.1 校验账户配合
        tenantService.handleTenantInfo(tenant -> {
            long count = userMapper.selectCount();
            if (count >= tenant.getAccountCount()) {
                throw exception(USER_COUNT_MAX, tenant.getAccountCount());
            }
        });
        // 1.2 校验正确性
        validateUserForCreateOrUpdate(null, createReqVO.getUsername(), createReqVO.getUserSn(),
                createReqVO.getMobile(), createReqVO.getEmail(), createReqVO.getDeptId(), createReqVO.getPostIds());

        // 2.1 插入用户
        AdminUserDO user = BeanUtils.toBean(createReqVO, AdminUserDO.class);
        user.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 默认开启
        if (createReqVO.getPassword() != null) {
            user.setPassword(encodePassword(createReqVO.getPassword())); // 加密密码
        }
        if (createReqVO.getPersonType().equals("1")){
            // 外协员工:w + 5 位数字,不足补零
            int nextVal = jdbcTemplate.queryForObject(
                    "SELECT nextval('outsourcing_user_sn')", Integer.class);
            user.setUserSn("W" + String.format("%05d", nextVal));
        }
        userMapper.insert(user);
        if (createReqVO.getImagePath() != null) {
            FaceImageDO faceImageDO = new FaceImageDO();
            faceImageDO.setPersonId(user.getId());
            faceImageDO.setImage(createReqVO.getImagePath());
            faceImageMapper.insert(faceImageDO);
        }
        // 2.2 插入关联岗位
        if (CollectionUtil.isNotEmpty(user.getPostIds())) {
            userPostMapper.insertBatch(convertList(user.getPostIds(),
                    postId -> new UserPostDO().setUserId(user.getId()).setPostId(postId)));
        }

        // 3. 记录操作日志上下文
        LogRecordContext.putVariable("user", user);
        return user.getId();
    }
相关推荐
workflower1 小时前
单元测试-例子
java·开发语言·算法·django·个人开发·结对编程
YuanlongWang1 小时前
C# 基础——装箱和拆箱
java·开发语言·c#
b78gb1 小时前
电商秒杀系统设计 Java+MySQL实现高并发库存管理与订单处理
java·开发语言·mysql
wb043072013 小时前
性能优化实战:基于方法执行监控与AI调用链分析
java·人工智能·spring boot·语言模型·性能优化
天若有情6734 小时前
Java Swing 实战:从零打造经典黄金矿工游戏
java·后端·游戏·黄金矿工·swin
lichong9514 小时前
Android studio 修改包名
android·java·前端·ide·android studio·大前端·大前端++
lichong9514 小时前
Git 检出到HEAD 再修改提交commit 会消失解决方案
java·前端·git·python·github·大前端·大前端++
@yanyu6664 小时前
Tomcat安装与HTML响应实战
java·tomcat·html
呼哧呼哧.5 小时前
Spring的核心思想与注解
数据库·sql·spring
21号 16 小时前
9.Redis 集群(重在理解)
数据库·redis·算法