auto_increment 自增键的一些说明

auto_increment 问题:

原文: https://yq.aliyun.com/articles/59263?spm=5176.8091938.0.0.bjzoFN

官方文档:https://dev.mysql.com/doc/refman/5.6/en/innodb-auto-increment-handling.html

导致auto_increment变小的几种情况:

1、 alter table xx auto_increment = yy;

2、 truncate table

3、 restart mysql

第三种的复现方法:

一张刚创建的innoDB表,目前自增是1.

插入3条记录后,auto_increment=4.

然后再删除掉这三条记录,auto_increment=4 没变

重启MySQL,会发现auto_increment值被清空了。我们插入的话,自动从1开始编号了

官方对于自增序号的初始化的几种情况的说明: 

InnoDB AUTO_INCREMENT Counter Initialization  

This section describes how InnoDB initializes AUTO_INCREMENT counters.

If you specify an AUTO_INCREMENT column for an InnoDB table, the table handle in the InnoDB data dictionary contains a special counter called the auto-increment counter that is used in assigning new values for the column. This counter is stored only in main memory, not on disk.

To initialize an auto-increment counter after a server restart, InnoDB executes the equivalent of the following statement on the first insert into a table containing an AUTO_INCREMENT column.

SELECT MAX(ai_col) FROM table_name FOR UPDATE;

InnoDB increments the value retrieved by the statement and assigns it to the column and to the auto-increment counter for the table. By default, the value is incremented by 1. This default can be overridden by the auto_increment_increment configuration setting.

If the table is empty, InnoDB uses the value 1. This default can be overridden by the auto_increment_offset configuration setting.

If a SHOW TABLE STATUS statement examines the table before the auto-increment counter is initialized, InnoDB initializes but does not increment the value. The value is stored for use by later inserts. This initialization uses a normal exclusive-locking read on the table and the lock lasts to the end of the transaction. InnoDB follows the same procedure for initializing the auto-increment counter for a newly created table.

After the auto-increment counter has been initialized, if you do not explicitly specify a value for an AUTO_INCREMENT column, InnoDB increments the counter and assigns the new value to the column. If you insert a row that explicitly specifies the column value, and the value is greater than the current counter value, the counter is set to the specified column value.

InnoDB uses the in-memory auto-increment counter as long as the server runs. When the server is stopped and restarted, InnoDB reinitializes the counter for each table for the first INSERT to the table, as described earlier.

A server restart also cancels the effect of the AUTO_INCREMENT = N table option in CREATE TABLE and ALTER TABLE statements, which you can use with InnoDB tables to set the initial counter value or alter the current counter value.

时间: 2024-10-14 11:10:39

auto_increment 自增键的一些说明的相关文章

InnoDB的自增键和row_id用完了会发生什么?

自增键用完了会发生什么? 我们在建表的时候为某个索引列( 注意:必须是索引列 )添加 AUTO_INCREMENT 属性,就像这样: CREATE TABLE t ( c1 TINYINT AUTO_INCREMENT, c2 TINYINT, KEY idx_c1 (c1)) ENGINE=InnoDB; 表 t 中包含一个索引列 c1 ,该列被添加了 AUTO_INCREMENT 属性.我们先向该表中插入一条记录: mysql> INSERT INTO t(c1, c2) VALUES(12

MySQL获得指定数据表中auto_increment自增id值的方法及实例

http://kb.cnblogs.com/a/2357592/很多情况下,我们要提前用到当前某个表的auto_increment自增列id,可以通过执行sql语句来查询到这个id值. show table status where name=’表名’ 或者 show table status like ‘表名’ 然后从查询到的结果集中获得auto_increment的值 代码实例:<?php mysql_connect("localhost","root",

SQL Server事务回滚对自增键的影响

SQL Server事务回滚时是删除原先插入导致的自增值,也就是回滚之前你你插入一条数据导致自增键加1,回滚之后还是加1的状态 --如果获取当前操作最后插入的identity列的值:select @@IDENTITY--如果要获取某表的最后的identity列的值:select IDENT_CURRENT('表名') --如果要模拟抛出异常可以用RAISERROR --RAISERROR('错误的描述',错误的严重级别代码,错误的标识,错误的描述中的参数的值(这个可以是多个),一些其它参数) -

MYSQL替换有Auto_increment的主键

在Mysql中,Auto_increment 一般都设在主键上,当你想要替换表单的主键时,要先删除自增长的特性才能删除主键的特性. 删除自增长    alter table A change id id int(5) ; 删除主键       alter table A drop primary key; 这时才能把其它列设为主键.

MySQL在INSERT IGNORE未新增记录时避免AUTO_INCREMENT自增

在MySQL5.7中做INSERT IGNORE时发现, 即使INSERT未成功执行, 表的自增主键却自动加1了, 在某些情况下需要避免这种行为. 需要修改的变量是 innodb_autoinc_lock_mode, 将其设为0后, 在INSERT未成功执行时不会自增主键. innodb_autoinc_lock_mode在MySQL各版本的默认值 根据MySQL官方手册的说明: There are three possible settings for the innodb_autoinc_l

MySQL事务回滚后自增键不连续

当在MySQL中使用事务,回滚后 ,会出现先自增id不连续的情况,解决:执行:          ALTER table tableName  AUTO_INCREMENT=1; 在回滚后都重置AUTO_INCREMENT的值. 注意:最好先了解MySQLl事务. 原文地址:https://www.cnblogs.com/donaldworld/p/10267370.html

MySQL查询数据表的Auto_Increment(自增id)

1.一般数据表的id都是设置成auto_increment的,所以当插入一条记录后,可以使用下面的命令来获取最新插入记录的id值 select last_insert_id(); 注意:1. 必须是在使用Insert语句后,紧接着使用select last_insert_id()才有效,在没有使用过Insert语句的情况下,查询返回的结果为0; 2.如果在同一条Insert语句插入多条记录,返回的结果是第一条记录对于的id,如 insert into school.student (name,

MySQL数据定义语句

MySQL数据定义语句主要是创建.修改.删除表,增加,修改,删除字段的操作 创建表:CREATE TABLE 表名(属性名 数据类型 约束条件, 属性名 数据类型 约束条件, 属性名 数据类型 约束条件, 属性名 数据类型 , ); 完整约束条件:PRIMARY KEY 主键FOREIGN KEY 外键NOT NULL 非空UNIQUE 唯一键AUTO_INCREMENT 自增键(mysql特色)DEFAULT 设置默认值 1.创建表test1 mysql> create table test1

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

测试缘由 一个开发同事做了一个框架,里面主键是uuid,我跟他建议说mysql不要用uuid用自增主键,自增主键效率高,他说不一定高,我说innodb的索引特性导致了自增id做主键是效率最好的,为了拿实际的案例来说服他,所以准备做一个详细的测试.   作为互联网公司,一定有用户表,而且用户表UC_USER基本会有百万记录,所以在这个表基础上准测试数据来进行测试.            测试过程是目前我想到的多方位的常用的几种类型的sql进行测试,当然可能不太完善,欢迎大家留言提出更加完善的测试方