首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >SpringBoot测试系列 - 处理数据库自增主键

SpringBoot测试系列 - 处理数据库自增主键

作者头像
Antony
发布于 2020-12-01 09:50:28
发布于 2020-12-01 09:50:28
1.7K0
举报

继续TestLinkJ中keywords服务接口的话题。

自增主键带来的问题

在keywords表中,'id' 是主键,并且在定义中有auto_increment,表明其是自增主键。

代码语言:javascript
复制
CREATE TABLE /*prefix*/keywords (
  `id` int(10) unsigned NOT NULL auto_increment,
  `keyword` varchar(100) NOT NULL default '',
  `testproject_id` int(10) unsigned NOT NULL default '0',
  `notes` text,
  PRIMARY KEY  (`id`),
  KEY /*prefix*/testproject_id (`testproject_id`),
  KEY /*prefix*/keyword (`keyword`),
  UNIQUE KEY /*prefix*/keyword_testproject_id (`keyword`,`testproject_id`)
) DEFAULT CHARSET=utf8;

在KeywordsService接口中,定义了createKeywords(Keywords keywords)这样一个方法,用以新增一个关键字。

代码语言:javascript
复制
@Service
public class KeywordsServiceImpl implements KeywordsService {

    @Autowired
    private KeywordsMapper keywordsMapper;
    @Override
    public Integer createKeywords(Keywords keywords) {
        return keywordsMapper.insert(keywords);
    }

}

这里就存在一个问题,假设我们目前最大的id是100,如果我们给系统新增如下一个关键字

代码语言:javascript
复制
 Keywords keywords=Keywords.builder().id(666).keyword("tester").testproject_id(333).notes("tester").build();

那么系统的id的最大值从100迁跃到了666。这时候如果我们delete掉所有记录,并重新将备份的数据插入,会发现无法插入,因为这时候数据库中下一个值为667。

问题解决-让系统决定id

因此,我们得让系统在插入关键字时,获取到系统当前的id最大值,然后将其作为该条拟插入数据的id,以防止跳号。

KeywordsMapper.xml

代码语言:javascript
复制
 <!-- 先查询自增主键值 -->
  <insert id="insert" parameterType="com.testlink4j.domain.Keywords">
    <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.Integer">
      SELECT LAST_INSERT_ID()
    </selectKey>
    insert into keywords (id, keyword, testproject_id,
      notes)
    values (#{id,jdbcType=INTEGER}, #{keyword,jdbcType=VARCHAR}, #{testproject_id,jdbcType=INTEGER},
      #{notes,jdbcType=LONGVARCHAR})
  </insert>

这样,就能解决数据库中自增ID的问题了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-09-01,如有侵权请联系 cloudcommunity@tencent.com 删除
目录
  • 自增主键带来的问题
  • 问题解决-让系统决定id
    • KeywordsMapper.xml
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档