往mysql中插入 自增id不连续(曾经的坑)

merphix(CSDN UID:u014567183) 给博主提供了莫大的帮助

问题描述

事情是这样的,博主用 Mybatis 往 mysql 做批量插入,结果发现特定的 SQL 语句导致 自增int型主键不连续,多方求证便有了这篇博文。

还原问题

建表语句

CREATE TABLE versionfileinfo (
  id INT NOT NULL PRIMARY KEY auto_increment,
  vid INT NOT NULL COMMENT '版本信息id' ,
  buildNo INT NOT NULL COMMENT '版本号' ,
  displayVersion VARCHAR (50) NOT NULL COMMENT '显示版本' ,
  fileKey VARCHAR (100) NOT NULL COMMENT '文件标识' ,
  fileSize BIGINT NOT NULL COMMENT '文件大小' ,
  fileUrl VARCHAR (1000) NOT NULL COMMENT '文件存放url' ,
  description VARCHAR (500) COMMENT '描述' ,
  checkType VARCHAR (50) COMMENT '校验方式' ,
  checkCode VARCHAR (500) COMMENT '校验码' ,
  createTime BIGINT NOT NULL COMMENT '秒级时间戳' ,
  lastUpdateTime BIGINT NOT NULL COMMENT '秒级时间戳' ,
  isActive bit NOT NULL COMMENT '删除标识' ,
  ts BIGINT NOT NULL COMMENT '毫秒级时间戳'
) ENGINE = INNODB DEFAULT CHARSET utf8;

批量插入方案一

INSERT INTO `versionfileinfo` (
    vid,
    buildNo,
    displayVersion,
    fileKey,
    fileSize,
    fileUrl,
    description,
    checkType,
    checkCode,
    createTime,
    lastUpdateTime,
    isActive,
    ts
)(
    SELECT
        1,
        2,
        '显示版本',
        NULL,
        NULL,
        'www.asdasd.com',
        '描述',
        "a",
        "b",
        123,
        123123,
        1,
        123123
)
UNION
    (
        SELECT
            1,
            2,
            '显示版本2',
            NULL,
            NULL,
            'www.asdasd.com',
            '描述',
            "a",
            "b",
            123,
            123123,
            1,
            123123
    )

批量插入方案二

INSERT INTO `versionfileinfo` (
    vid,
    buildNo,
    displayVersion,
    fileKey,
    fileSize,
    fileUrl,
    description,
    checkType,
    checkCode,
    createTime,
    lastUpdateTime,
    isActive,
    ts
)
VALUES
    (
        1,
        1,
        '显示版本',
        NULL,
        NULL,
        'www.asdasd.com',
        '描述',
        "a",
        "b",
        123,
        123123,
        1,
        123123
    ),
(
        1,
        2,
        '显示版本',
        NULL,
        NULL,
        'www.asdasd.com',
        '描述',
        "a",
        "b",
        123,
        123123,
        1,
        123123
    )

结果发现方案一会导致自增id不连续,二方案二id是连续的
举例:id为自增主键
先清空数据表
上面提供的批量插入sql语句一次插入2条记录
第一次运行 第一条id =1 ,第二条id=2
第二次运行 第三条id =4 ,第四条id=5
第三次运行 第五条id =7 ,第六条id=8

问题实质

和 MySQL 的 innodb 数据库引擎相关,据说是 MyISAM 引擎 不会有这种问题

innodb 自增列 锁机制简述

解决方案

  1. 换掉 innodb 数据库引擎
  2. 用上提到的方案二SQL
  3. 配置 innodb_autoinc_lock_mode 参数

MySQL 官方 innodb_autoinc_lock_mode 文档

innodb_autoinc_lock_mode 类型简述

innodb_autoinc_lock_mode 配置方法

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值