V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
haozhang
V2EX  ›  MySQL

MySQL auto_increment 之后插入的奇怪问题。

  •  1
     
  •   haozhang ·
    Summerlve · 2015-07-30 09:23:25 +08:00 · 4666 次点击
    这是一个创建于 3197 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我将主键设成了auto_increment,当我insert的时候有些时候生成的结果会是这样的:
    1
    3
    4

    主键值跳过了2,当我把记录全部删除在将auto_increment重新记数之后,再插入,结果又正确了:
    1
    2
    3
    4

    这是什么原因?

    26 条回复    2015-07-30 22:41:44 +08:00
    sivacohan
        1
    sivacohan  
       2015-07-30 09:26:32 +08:00 via Android
    有事务失败了。
    haozhang
        2
    haozhang  
    OP
       2015-07-30 09:29:33 +08:00
    @sivacohan 我直接在mysql的命令行下insert也需要提交事务吗?
    sivacohan
        3
    sivacohan  
       2015-07-30 09:31:38 +08:00 via Android
    你具体情况我不太清楚。检查一下MySQL都有哪些连接。看一下日志吧。
    如果你只有insert,这个基本就是有事务失败。
    haozhang
        4
    haozhang  
    OP
       2015-07-30 09:35:47 +08:00
    我的autocommit设置为1,应该事务是自动的吧?
    haozhang
        5
    haozhang  
    OP
       2015-07-30 09:36:11 +08:00
    @sivacohan 嗯。
    pH
        6
    pH  
       2015-07-30 09:46:57 +08:00
    说实话我还是第一次看到这样的情况。 一般出现间断的情况都是因为我手动删除了。
    thinkmore
        7
    thinkmore  
       2015-07-30 09:57:38 +08:00
    我开始看到也是怀疑手动删除了,你看下是不是有其他人操作你的数据库,或者看看日志,不要在意这些细节
    haozhang
        8
    haozhang  
    OP
       2015-07-30 10:01:59 +08:00
    @thinkmore 本机上的环境...不是服务器。
    haozhang
        9
    haozhang  
    OP
       2015-07-30 10:02:25 +08:00
    @pH 所以很困惑啊。
    thinkmore
        10
    thinkmore  
       2015-07-30 10:13:37 +08:00
    没有复现了吧?这个确实是不太好解决,建议不要浪费时间在这上面了
    ncwhale
        11
    ncwhale  
       2015-07-30 10:25:14 +08:00
    建议检查一下MySQL设置喵……如果是新项目,及早换数据库喵……PG或者Mongo都好喵……
    mkeith
        12
    mkeith  
       2015-07-30 10:53:22 +08:00
    插入失败还是会自增的吧
    millson
        13
    millson  
       2015-07-30 11:12:10 +08:00
    保存所有的sql,然后再查
    gkiwi
        14
    gkiwi  
       2015-07-30 11:38:48 +08:00
    事务会预先读个id先占着,用不用到再说,保证并发时候主键id不冲突。
    比如事务1 先占了10,事务2接着占了11,结果事务1执行失败,10这个id就被弃了。
    zonghua
        15
    zonghua  
       2015-07-30 11:52:54 +08:00
    @ncwhale mongodb连自增都没有。要自己查询再加一
    est
        16
    est  
       2015-07-30 12:53:54 +08:00
    处女座玩 auto_increment 是一种怎么样的体验。。。
    broadliyn
        17
    broadliyn  
       2015-07-30 13:08:42 +08:00
    @zonghua 自己查询再加1在并发高的环境下不怕id重复吗?毕竟不是类似redis的incr的原子操作
    zonghua
        18
    zonghua  
       2015-07-30 13:28:01 +08:00 via iPhone
    @broadliyn node没有这种问题吧,毕竟单线程,反正我是很懂
    lilydjwg
        19
    lilydjwg  
       2015-07-30 13:40:35 +08:00
    @ncwhale MongoDB 的 Python 客户端库很坑的,经常升级之后代码就要改,根本不管兼容性。
    sujin190
        20
    sujin190  
       2015-07-30 14:00:34 +08:00
    @zonghua 用mongo还自增1,你多蛋疼。。。
    zonghua
        21
    zonghua  
       2015-07-30 14:13:49 +08:00
    @sujin190 那我需要一个数字的编号啊,ObjectId是字符串
    haozhang
        22
    haozhang  
    OP
       2015-07-30 17:01:58 +08:00
    @thinkmore 关键是有复现啊,我觉得可能是我开了sequel pro?这货会一直占着一条连接?
    不想了,随它去吧。
    lianyue
        23
    lianyue  
       2015-07-30 17:19:53 +08:00
    无论插入成功没 id 都会自增1
    haozhang
        24
    haozhang  
    OP
       2015-07-30 20:31:32 +08:00
    @lianyue 我在命令行下面插三条数据,每条都插入成功了....就是会从1跳到3。
    karloku
        25
    karloku  
       2015-07-30 22:27:26 +08:00
    @zonghua mongodb 的 ObjectId 其实就是个 12bytes 的16进制数, 可以直接转成integer用. 手动+1这事情太不靠谱了...
    zonghua
        26
    zonghua  
       2015-07-30 22:41:44 +08:00 via iPhone
    @karloku 看来我好多东西都不知道呢,用node.js 做一个blog,我直接拿Date.now( )做编号,😓
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1073 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 23:55 · PVG 07:55 · LAX 16:55 · JFK 19:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.