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();
    }
相关推荐
程序员老邢6 分钟前
【技术底稿 12】内网统一日志系统 Loki + Promtail 全流程部署(对接 Grafana,监控日志一体化)
java·运维·程序人生·grafana·devops
银河系的一束光11 分钟前
使用 IntelliJ IDEA 开发 Java 程序时 , 会遇到以下中文乱码问题 :
java·ide·intellij-idea
Paxon Zhang17 分钟前
MySQL 大师之路**数据库约束,表设计,CRUD**
android·数据库·mysql
Via_Neo18 分钟前
判断字符串前缀(26年蓝桥杯JAVA B组)
java·职场和发展·蓝桥杯
HealthScience24 分钟前
clinvar数据集说明
数据库·oracle
XiYang-DING25 分钟前
【Java】从源码深入理解HashMap和TreeMap
java·开发语言
王的宝库32 分钟前
【MySQL】主从复制原理详解:从 Binlog 到数据一致性
数据库·mysql
Vect__33 分钟前
MySQL基本认知、库和表的操作
数据库·mysql
若水不如远方35 分钟前
一文讲透单点登录原理(SSO):从同域共享到跨域票据
java·后端
不懂的浪漫35 分钟前
mqtt-plus 架构解析(七):动态订阅与重连恢复,为什么能走同一条协调路径
java·物联网·mqtt·架构