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();
    }
相关推荐
奇牙coding9 分钟前
doubao-seed-2.1-pro 报 HTTP 401 怎么办?Key 正确也要检查请求头和端点
网络·数据库·http·ai
_Evan_Yao6 小时前
Redis 缓存穿透、击穿、雪崩,一次讲清!
java·spring·mybatis
梓豪csd6 小时前
消息订阅中心:谁该收到哪条通知
java·开发语言·人工智能·低代码·自动化·1024程序员节
秋饼6 小时前
Spring AI 2.1 Message Parts 深度实战:推理签名回放与跨轮记忆持久化的源码级落地
java·ai·技术分享·后端开发
thefool1122667 小时前
TCP 1
java·1024程序员节
不脱发的程序猿8 小时前
纳指ETF量化策略
数据库·人工智能·1024程序员节
程序员塔塔喵9 小时前
【MySQL篇|第一篇】索引失效的情况
数据库·mysql·索引失效
北京青蓝智慧马老师9 小时前
比外部黑客更难防的,是那个有权限的自己人(3 个脱敏复盘)
大数据·数据库·人工智能
金銀銅鐵10 小时前
[Java] 用 GUI 展示 EnumSet 增减元素时的内部变化(下)
java·后端·ai编程
AI人工智能+电脑小能手10 小时前
一次请求打几个下游,这个Java并行任务工具类6个方法按序聚合
java·线程池·并发编程·1024程序员节·批量处理·并行任务