zoukankan      html  css  js  c++  java
  • 关于mysql的自增测试,innodb和myisam下的不同表现

    关于mysql的自增测试,innodb和myisam下的不同表现

    innodb引擎下的自增id测试

    1 innodb引擎下,如果显示insert了最大值,那么下次的AUTO_INCREMENT值就是这个最大值+1

    2 如果这时候再把其中一个id值update成10,那么下次的AUTO_INCREMENT却还是不变

    (修改的还是同一行,命令输错了,多写了一步)

    3 如果这时再利用自增段去插入,到了10的时候是会报错的

    但是这个时候继续插入,就不会报错,因为刚才即使报错了,AUTO_INCREMENT

    的值依旧会增加

    4 如果db重启了,那么innodb表在启动后,AUTO_INCREMENT值会自动检测出当前表中的最大值+1

    先重启mysql

    AUTO_INCREMENT的值为111

    测试4.1:手工修改AUTO_INCREMENT值为110,重启db,发现AUTO_INCREMENT还是原来的没有修改前的AUTO_INCREMENT,因为我只修改了但并没有插入数据,顺便提一句,AUTO_INCREMENT值只能设置得比当前值大,不能比当前值小,如果设置得比当前值小,它会默认调整到当前的最大值。

    测试4.2 插入一条111的记录,重启db,这时AUTO_INCREMENT应该不变,符合猜测

    测试4.3,删除该表的所有记录,不重启db的话AUTO_INCREMENT不变,如果重启db则AUTO_INCREMENT会置空,重新计数,符合猜测

    myisam引擎下自增id

    1 myisam引擎下,如果显示insert了最大值,那么下次的AUTO_INCREMENT值就是这个最大值+1

    mysql> insert into myisam_test values(); Query OK, 1 row affected (0.00 sec)

    mysql> insert into myisam_test values(); Query OK, 1 row affected (0.00 sec)

    mysql> insert into myisam_test(id) values(5); Query OK, 1 row affected (0.00 sec)

    mysql> show create table myisam_testG ********* 1. row ********* Table: myisam_test Create Table: CREATE TABLE myisam_test ( id int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (id) ) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 1 row in set (0.00 sec)

    2 如果这时候再把其中一个id值update成105,那么下次的AUTO_INCREMENT就会变成106(这和innodb是不同的!)

    mysql> update myisam_test set id=105 where id=1; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0

    mysql> select * from myisam_test;

    +-----+

    | id |

    +-----+

    | 2 |

    | 5 |

    | 105 |

    +-----+

    3 rows in set (0.00 sec)

    mysql> show create table myisam_testG

    ********* 1. row *********

    Table: myisam_test Create Table:

    CREATE TABLE myisam_test (

    id int(11) NOT NULL AUTO_INCREMENT,

    PRIMARY KEY (id)

    ) ENGINE=MyISAM AUTO_INCREMENT=106 DEFAULT CHARSET=utf8

    1 row in set (0.00 sec)

    3 当db重启后,myisam引擎的AUTO_INCREMENT值不变

    测试3.1 手工修改AUTO_INCREMENT值为110,重启db,发现AUTO_INCREMENT还是110,符合猜测

    测试3.2 删除该表下的所有记录,重启db,AUTO_INCREMENT值不变

     

    总结:

    • 现在使用的一般都是innodb引擎,如果将myisam引擎转换过来的时候,一定要小心这个引擎在自增id上的不同表现

    • 自增id的列不要显示指定自增id值,myisam还好,innodb是可能引起重复主键错误

    • 在主从使用不同引擎的时候,也会出现问题,最好将引擎改完一致性的

    清风徐来.水波不兴
  • 相关阅读:
    汇编14:端口
    汇编13:int指令
    整个软件开发的流程
    css grid 布局
    socket粘包处理
    如何做好需求变更管理?——需求变更流程规范
    软件工程需求分析文档模板
    使用layui的form.on绑定select选中事件, form.on()不执行的原因分析
    ID4收藏
    ASP.NET MVC5中View-Controller间数据的传递
  • 原文地址:https://www.cnblogs.com/ghl666/p/11931314.html
Copyright © 2011-2022 走看看