为图方便,建表直接用了mysql的自增id

开发时进行插入操作时,发现插入失败id也自增了,导致id不连续

并且无论是删除还是插入,id是一直在增加

查询结果

MySQL自增ID机制:

InnoDB存储引擎的自增ID是持久化的,每次执行INSERT操作(无论成功与否)都会触发自增ID递增。

即使插入失败或事务回滚,自增ID也不会回退,导致ID不连续。

GORM执行流程:

GORM生成并执行INSERT语句,MySQL在收到语句时立即分配自增ID。

若插入因约束冲突(如唯一索引)失败,错误返回给GORM,但自增ID已消耗。

解决办法

理解自增ID设计:

自增ID的核心目的是保证唯一性和递增性,不保证连续性。

应用层不应依赖自增ID的连续性,需避免业务逻辑与ID连续性耦合。

更换主键生成策略:

UUID:生成全局唯一字符串,避免依赖数据库自增ID。

go

type User struct {

ID string gorm:"primaryKey;default:uuid()"

Name string

}

雪花算法(Snowflake):分布式环境下生成趋势递增的唯一ID。

业务自定义ID:如时间戳+序列号组合,由应用层控制ID生成。

调整事务范围:

若插入前需进行校验,尽量在事务外完成校验,减少无效自增ID的产生。

但需注意,事务内的多次插入仍可能导致ID跳跃。

监控与处理:

检查插入失败的具体原因(如唯一约束冲突),记录日志并告警。

示例代码:

go

err := db.Create(&user).Error

if err != nil {

log.Printf("插入失败: %v", err)

// 处理错误(如重试、调整数据等)

}

mysql的自增id的更多相关文章

  1. MYSQL获取自增ID的四种方法

    MYSQL获取自增ID的四种方法 1. select max(id) from tablename 2.SELECT LAST_INSERT_ID() 函数 LAST_INSERT_ID 是与tabl ...

  2. mysql 数据库自增id 的总结

    有一个表StuInfo,里面只有两列 StuID,StuName其中StuID是int型,主键,自增列.现在我要插入数据,让他自动的向上增长,insert into StuInfo(StuID,Stu ...

  3. MySQL 使用自增ID主键和UUID 作为主键的优劣比较详细过程(从百万到千万表记录测试)

    测试缘由 一个开发同事做了一个框架,里面主键是uuid,我跟他建议说mysql不要用uuid用自增主键,自增主键效率高,他说不一定高,我说innodb的索引特性导致了自增id做主键是效率最好的,为了拿 ...

  4. mysql数据库自增id重新从1排序的两种方法

    mysql默认自增ID是从1开始了,但当我们如果有插入表或使用delete删除id之后ID就会不会从1开始了哦.   使用mysql时,通常表中会有一个自增的id字段,但当我们想将表中的数据清空重新添 ...

  5. DBS-MySQL:MYSQL获取自增ID的四种方法

    ylbtech-DBS-MySQL:MYSQL获取自增ID的四种方法 1.返回顶部 1. 1. select max(id) from tablename 2.SELECT LAST_INSERT_I ...

  6. mysql数据库表自增ID批量清零 AUTO_INCREMENT = 0

    mysql数据库表自增ID批量清零 AUTO_INCREMENT = 0 #将数据库表自增ID批量清零 SELECT CONCAT( 'ALTER TABLE ', TABLE_NAME, ' AUT ...

  7. mysql 返回自增id

    String dateNow=  DateTime.Now.ToString("yyyyMMddhhmmss"+  new Random().Next(1, 99)); //随机数 ...

  8. MySQL中自增ID起始值修改方法

    在实际测试工作过程中,有时因为生产环境已有历史数据原因,需要测试环境数据id从某个值开始递增,此时,我们需要修改数据库中自增ID起始值,下面以MySQL为例: 表名:users; 建表时添加: ); ...

  9. MySQL 的自增 ID 用完了,怎么办?

      一.简述 在 MySQL 中用很多类型的自增 ID,每个自增 ID 都设置了初始值.一般情况下初始值都是从 0 开始,然后按照一定的步长增加.在 MySQL 中只要定义了这个数的字节长度,那么就会 ...

  10. MySQL 使用自增ID主键和UUID 作为主键的优劣比較具体过程(从百万到千万表记录測试)

      主键类型 SQL语句 运行时间 (秒)   (1)模糊范围查询1000条数据,自增ID性能要好于UUID 自增ID SELECT SQL_NO_CACHE t.* FROM test.`UC_US ...

随机推荐

  1. arch 音频处显示没有输入或输出设备

    我的设备是 Dell G15 5511, 属于比较新的设备, 查看了 Fourm 与 wiki 后使用 1 yay -S sof-firmware   安装框架之后重启即可使用.

  2. Spirng Data JPA 之Specification中and、or的使用

    项目中,有的地方存值以逗号分隔的方式来存储,但查询的时候是需要满足单个值或者多个值条件查询,因此用到Specification中and.or组合使用,此文用来记录,以防后用. 描述:parentCod ...

  3. Qt音视频开发34-Onvif时间设置

    一.前言 对设备设置时间很有必要,这个是必备的功能,毕竟大部分的前端设备比如摄像机本身不带BIOS电池的,所以没法存储时间,要么设置了NTP地址来同步时间,要么其他设备主动对他进行设置时间,如果时间不 ...

  4. MIPI/LVDS/PCIE/HDMI 设计规范

      参考链接: 1.MIPI/LVDS/PCIE/HDMI 2.接口简介(HDMI .eDP/DP.LVDS.VGA.YPbPr.DVI.MHL.MIPI-DSI.VbyOneHS) 3.干货 | 带 ...

  5. [转]CLion安装及无限试用

    Clion安装及无限试用:链接:https://pan.baidu.com/s/1mreUx5QyS4nkVQMOhdjf7g提取码:ylqw 翻译 搜索 复制

  6. 在用Android StudioBuild项目时,提示:Could not resolve all files for configuration ':classpath'.Could not find com.android.tools.

    在用Android StudioBuild项目时,提示:Could not resolve all files for configuration ':classpath'.Could not fin ...

  7. 即时通讯技术文集(第40期):推送技术合集(Part2) [共18篇]

    为了更好地分类阅读 52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第 40 期. [- 1 -] 一个基于长连接的安全可扩展的订阅/推送服务实现思路 [链接] h ...

  8. IM跨平台技术学习(二):Electron初体验(快速开始、跨进程通信、打包、踩坑等)

    本文由蘑菇街前端技术团队分享,原题"Electron 从零到一",有修订和改动. 1.引言 在上篇<快速了解新一代跨平台桌面技术--Electron>,我们已经对Ele ...

  9. Solution -「CF 1366E2」Chiori and Doll Picking (hard version)

    \(\mathscr{Description}\)   Link.   给定 \(\{a_n\}\), 值域 \([0,2^m)\). 对于每个 \(i\in[0,m]\), 求有多少个 \(\{a_ ...

  10. CDS标准视图:销售变现天数 I_DaysSalesOutstanding

    视图名称:销售变现天数 I_DaysSalesOutstanding 视图类型:参数 视图代码: 点击查看代码 @AbapCatalog.sqlViewName: 'IFIDAYSSLSOUTSTG' ...