日期:2014-05-16 浏览次数:20457 次
mysql数据库使用auto_increment 字段来辅助为自增列赋值。
?
?
?输出
?
?
auto_increment_increment??= 1 ,每次插入数据,id++;auto_increment_offset =1 ,说明从1开始。
一般情况下auto_increment_increment=1,auto_increment_offset=1.是默认初始值。
我们可以在my.cnf文件中进行重新指定。auto_increment满足一个数学当纳法推导公
式:
value=auto_increment_increment*N+auto_increment_offset
?
表中有auto_increment列,innodb用一种锁策略来保正这个auto_increment列值。
如果我们创建一个表,指定了auto_increment表。那么innodb会维护一个auto_increment
计数器。
?
当访问这个计数器,innodb会使用表级锁来锁定这访问过程,这个发生在分析auto_increment
值的过程中,而不是在一个执行事务中。也就是说:这个访问发生在事务执行前面。所以和这个锁
不是发生整个事务过程中,仅仅是分析语句判断出auto_increment这一过程中.
?
auto_increment计数器,一直维护在内存中,当server重启或是停止后重启,innodb会为每个表
初始化这个计数器.
?
?
对一个含有自增列(通常为id)的表执行
?
?
?可以得到类似输出:
?
?
?
其中该状态下,表中AUTO_INCREMENT 字段值为704677 ,说明下一个插入的id 为704677 ,同时插入成功后,AUTO_INCREMENT=704678.
?
mysql 数据库中的id设为自增,容易产生id不连续的问题。有时将一个表中的所有数据清除,但是在插入数据时,id还是在未清除前的基础上累加。
要解决的问题:
1. 删除数据,同时要求再次插入数据时,id从1 开始累计
(1) TRUNCATE TABLE table_name;
(2)?DELETE FROM?table_name; ? ?
?ALTER TABLE table_name?auto_increment =1 ;
对上面两种方法进行一下分析。Truncate table 表名 速度快,而且效率高,因为:TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少。DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项。TRUNCATE TABLE 通过释放存储表数据所用的数据页来删除数