V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
gebishushu
V2EX  ›  问与答

mysql 如何通过配置文件修改让 id 自增连续起来呢?

  •  
  •   gebishushu · 2019-12-04 04:45:22 +08:00 · 2988 次点击
    这是一个创建于 1577 天前的主题,其中的信息可能已经有所发展或是发生改变。

    id 为主键且自增,由于数据表数据删除等问题,id 会断续 我查到几条命令可以搞,但是总不能每次删除后再执行下这个命令吧 所以有没有一次性修改好的办法呢?

    23 条回复    2019-12-04 16:17:11 +08:00
    msg7086
        1
    msg7086  
       2019-12-04 07:00:37 +08:00
    id 原本就是一条记录的固定标识,原本就不应该被修改。
    修改 id 本来就相当于重新建表了(因为所有的关联表都会炸)。

    如果你需要一个连续的 id,那就不应该去用自增主键。自增主键本来就会变得不连续。
    opengps
        2
    opengps  
       2019-12-04 07:24:32 +08:00 via Android
    程序处理,不用自增
    JiShuTui
        3
    JiShuTui  
       2019-12-04 08:29:54 +08:00 via Android   ❤️ 2
    请说出你的最原始需求来,可能你对需求理解有误。
    活了三十年,第一次听说有人想改 id,而且改 id 的目的竟然是为了 id 连续。
    lhx2008
        4
    lhx2008  
       2019-12-04 08:30:33 +08:00 via Android
    可能只是强迫症了吧
    littlemoney
        5
    littlemoney  
       2019-12-04 09:11:11 +08:00 via Android
    id 不连续的问题是啥呢?
    qping
        6
    qping  
       2019-12-04 09:22:26 +08:00
    如果你的需求是:根据连续的 id 可以知道某一个记录的上一条或者下一条记录,比如博客上一篇或者下一篇功能。
    不应该修改 id,而是额外增加一个字段,存储连续的字段。
    或者在一条记录中记录上一条或者下一条是记录是什么。
    qping
        7
    qping  
       2019-12-04 09:25:16 +08:00   ❤️ 2
    一般 id 是聚簇索引,是数据记录真实写入到硬盘的位置,修改某一条记录的 id 会导致这条记录之后全部的数据都被移动重写,导致巨大的磁盘 IO,是很恐怖的想法
    fancy111
        8
    fancy111  
       2019-12-04 09:29:41 +08:00
    很简单的问题,你需要完全连续的话,每次删除记录好被删的 ID,下次添加记录的时候写死 ID 插入,之后再删除这个记录就好。无记录的情况下自增。
    Woood
        9
    Woood  
       2019-12-04 09:34:18 +08:00
    你为什么删除的时候不假删除呢
    DeweyLiu0
        10
    DeweyLiu0  
       2019-12-04 09:34:54 +08:00 via Android
    曾经我也有过这样的强迫症😄然后就思考为什么新创建的不是接着上面的呢?
    jeymingwu
        11
    jeymingwu  
       2019-12-04 09:36:33 +08:00
    盲猜是在前端展示更美观?
    agee
        12
    agee  
       2019-12-04 09:39:19 +08:00 via iPhone
    展示 id 为什么要和数据库 id 一致,新加一个用于展示的字段不就好了,还能卖靓号♞
    SjwNo1
        13
    SjwNo1  
       2019-12-04 09:43:54 +08:00
    物理删除可还行
    ShundL
        14
    ShundL  
       2019-12-04 09:44:53 +08:00
    搞个 redis list 保存已删除的 id,每次删除时把 Id 放到 list 里,下次要插入时优先从 list 里取, 哈哈哈哈哈哈。。。
    Egfly
        15
    Egfly  
       2019-12-04 09:45:29 +08:00
    不知道你的需求是什么,改 id 会带来大量的磁盘 IO,除非你这里的 id 不是索引。建议去看一下[mysql 索引原理]( https://juejin.im/post/5bd7a97de51d45400d5d7b18)。
    hoythan
        16
    hoythan  
       2019-12-04 10:57:50 +08:00
    吧 ID 一列删除,重新添加一列 ID,可以重置所有的 ID 顺序,简单明了,赶紧试试吧。
    gebishushu
        17
    gebishushu  
    OP
       2019-12-04 12:19:57 +08:00
    @msg7086
    @opengps
    @JiShuTui
    @lhx2008
    @qping
    @fancy111
    @DeweyLiu0
    @Egfly
    @hoythan

    感谢各位大佬的回复,确实如楼上所言,打算把展示的美观些,看来重新建个新表做这个事情才是最正确的原则
    opengps
        18
    opengps  
       2019-12-04 12:33:43 +08:00
    ID 该有还得有,额外增加一个程序递增排序列实现吧
    optional
        19
    optional  
       2019-12-04 12:36:17 +08:00
    一般人想要递增非连续的 id
    godwinma
        20
    godwinma  
       2019-12-04 14:36:49 +08:00
    你这想法,纯属强迫症作祟,何必呢? id 连续除了带来更复杂的东西,额外收益是什么?
    lxk11153
        21
    lxk11153  
       2019-12-04 16:10:39 +08:00
    递增连续 id 还容易被暴力爬~
    ipwx
        22
    ipwx  
       2019-12-04 16:13:31 +08:00
    @gebishushu 你难不成认为一个毫无意义的数字是对一般人友好的?

    给个建议,为每个文章,根据标题生成一个有意义的 slug,然后通过 slug 查找这篇文章。这才是对一般人有意义的做法。
    arthas2234
        23
    arthas2234  
       2019-12-04 16:17:11 +08:00
    @lxk11153 这个我还真见过,很久之前了,发现一个论坛的获取用户信息的 url 是 /users/{id},id 是个三位数字,我就好奇是不是自增的。结果还真是,而且还没做鉴权,拿到一堆用户信息,不过就是一个小论坛估计是学生搞得
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1343 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 23:37 · PVG 07:37 · LAX 16:37 · JFK 19:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.