auto_increment
自动增长列必须是索引,如果是组合索引,innodb必须是组合索引的第一列,而myisam可以是组合索引的其它列,自动增长列是按照前面几列进行排序后递增的
1 用法:
CREATE TABLE test
(
id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(15) NOT NULL
) AUTO_INCREMENT = 100;
可在建表时可用“AUTO_INCREMENT=n”选项来指定一个自增的初始值。
可用alter table table_name AUTO_INCREMENT=n命令来重设自增的起始值。
2 说明:
(1)如果把一个NULL、0插入到一个AUTO_INCREMENT数据列里或不为其明确指定值,MySQL将自动生成下一个序列编号。编号从1开始,并1为基数递增。
(2)当插入记录或用UPDATE命令更新自增列时,如果为AUTO_INCREMENT数据列明确指定了一个数值,则会出现两种情况,情况一,如果插入的值与已有的编号重复,则会出现出错信息;
情况二,如果插入的值大于已编号的值,则会把该插入到数据列中,并使在下一个编号将从这个新值开始递增。也就是说,可以跳过一些编号。
(3)可以使用LAST_INSERT_ID() SQL函数或mysql_insert_id() C API 函数来查询最新的AUTO_INCREMENT值。这些函数与具体连接有关,因此其返回值不会被其它执行插入功能的连接影响。对于多行插入,last_insert_id()和mysql_insert_id()从插入的第一行实际返回auto_increment关键字,在复制设置中,通过该函数可以再其它服务器上正确复制多行插入。
(4)对于myisam和bdb表,可以再第二栏指定auto_increment以及多列索引。此时auto_increment列的生成的值的计算方法为:max(auto_increment_column)+1 where prefix=given-prefix.如果想要将数据放入到排序的组中可以使用。在任何组中删除有最大auto_increment值的行,将会重新用到auto_increment值。对于myisam表也是如此,一般不重复使用auto_increment值 。MySQL重启后InnoDB会把AUTO_INCREMENT会变成max(id)+1。如果不使用事务的话还是用MyISAM吧,MyISAM把自增主键的最大ID记录到数据文件里,重启MySQL后,自增主键的最大ID也不会丢失。
3 auto_increment自增id不连续
一般情况下auto_increment_increment=1,auto_increment_offset=1.是默认初始值。我们可以在my.cnf文件中进行重新指定。
auto_increment满足一个数学当纳法推导公式: value=auto_increment_increment*N+auto_increment_offset
innodb用一种锁策略来保正这个auto_increment列值。innodb会维护一个auto_increment计数器。当访问这个计数器,innodb会使用表级锁来锁定这访问过程,这个发生在分析auto_increment值的过程中,而不是在一个执行事务中。也就是说:这个访问发生在事务执行前面。所以和这个锁不是发生整个事务过程中,仅仅是分析语句判断出auto_increment这一过程中.
auto_increment计数器,一直维护在内存中,当server重启或是停止后重启,innodb会为每个表初始化这个计数器.
当我们开始一个事务向一个插入数据,最后却rollback.这时我们会看见auto_increment列会间隙.
4 innodb_autoinc_lock_mode来控制auto_increment.
innodb_autoinc_lock_mode可以取三种值.
innodb_autoinc_lock_mode=0 (“traditional” lock mode)
针对于所有INSERT LIKE 语句提供一个表级锁,直到执行语句结束.这个设置能保证auto_increment值的连续性.(当然可能还是有gap的,比如事务rollback)
innodb_autoinc_lock_mode=1 (“consecutive” lock mode)
bluk_inserts:会有持有表锁,直到语句结束.这个行为在INSERT…SELECT REPLACE…SELECT LOAD DATE情况下都会有表锁存在.
Simple inserts:会持有一个轻量级的锁,仅仅在确定auto_increment阶段.
Mixed-mode inserts:也会持有一个轻量级的锁,但这个分配过程中,会分配连续auto-increment并且足够多。
整个语句执行完毕过后,有没有用到,会浪费部分ID值.
innodb_autoinc_lock_mode = 2 (“interleaved” lock mode)
不像”insert like”采用表级那样,而是多个可以同时执行.但是对于基于语句的复制是非常不安全。
因为从binary log里面重新执行语句,会造成auto-increment值不一样.这个方式就是多个insert like可以
并发执行,所以auto_increment值间隔不是不可避免的.因为采取是谁来就执行谁.
只有simple insert可以预告知道auto-incrment值大小,没有间隔,像mixed-mode inserts与blulk insert、造成increment值间隔不可避免的.
复制结构中innodb_autoinc_lock_mode
1.当执行基于语句复制结构中,设置innodb_autoincr_lock_mode=0或是1来保证master与slave值一样。
但是当于设置innodb_autoincr_lock_mode=2就不能保证master-slave auto_increment值一样。因为语句重放
随机执行.当基于行的复制,设置任何值都是安全的.