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();
    }
相关推荐
Full Stack Developme1 分钟前
Redis 可以实现哪些业务功能
数据库·redis·缓存
better_liang3 分钟前
每日Java面试场景题知识点之-Java修饰符
java·访问控制·static·abstract·final·修饰符·企业级开发
rgeshfgreh18 分钟前
Spring事务传播机制深度解析
java·前端·数据库
无名-CODING19 分钟前
Java Spring 事务管理深度指南
java·数据库·spring
xiaolyuh12319 分钟前
Spring MVC Bean 参数校验 @Validated
java·spring·mvc
想唱rap25 分钟前
MYSQL在ubuntu下的安装
linux·数据库·mysql·ubuntu
蕨蕨学AI26 分钟前
【Wolfram语言】45.2 真实数据集
java·数据库
The Sheep 202334 分钟前
MongoDB与.Net6
数据库·mongodb
予枫的编程笔记40 分钟前
【Java集合】深入浅出 Java HashMap:从链表到红黑树的“进化”之路
java·开发语言·数据结构·人工智能·链表·哈希算法
BryceBorder43 分钟前
SCAU--数据库
数据库·oracle·dba