Py学习  »  DATABASE

MySQL主键

慧鑫coming • 5 年前 • 177 次点击  

不同引擎主键自增值的保存

  • MyISAM引擎的自增值保存在数据文件中。
  • InnoDB,MySQL5.7及以前的版本,保存在内存里(没有持久化,MySQL重启后不会记录之前的值,而是找当前最大的id值+1);MySQL8.0版本后,保存在redo log中,有恢复能力。

字段定义为AUTO_INCREMENT的行为

  • 如果插入的数据字段为0,null或未指定值,那么就把这个表当前的AUTO_INCREMENT值填到自增字段。
  • 如果插入数据时指定了字段具体的值,就直接使用指定的值。
      1、如果要插入的值<当前的自增值,那么这个表的自增值(AUTO_INCREMENT)不变。
      2、如果要插入的值>=当前自增值,把当前的自增值修改为新的自增值。

新的自增值生成算法

  • auto_increament_offset开始,以auto_increment_increment为步长,持续叠加,直到找到第一个大于要插入值的值,作为新的自增值。
  • auto_increment_offset表示初始值auto_increment_increment表示步长,默认值都是1。
  • 初始值步长都是1的情况下,新的自增值生成逻辑:
      1、要插入的值>=当前的自增值,新的自增值就是要插入的值+1
      2、否则,自增值不变。
  • 某些场景下初始值步长不全是默认配置。比如双M的主备结构要求双写的时候,就可能将步长设置为2,让一个库的自增id是奇数,另一个库的自增id是偶数,避免两个库生成的主键发生冲突。

可能导致自增值不连续的原因

  • 数据插入操作出现Duplicate key error后。
  • 事务回滚后。
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/29130
 
177 次点击