霜天部落 | 关注LAMP高性能、高并发架构的设计与研究

MySQL中auto_increment属性介绍

MySQL 里面,独一无二的编号是通过数据列的auto_increment 属性而自动生成一组序列编号的办法来实现的。MySQL 目前支持多种数据表类型,不同的数据表类型对于auto_increment 属性的处理机制是不一样的!所以我们不仅需要掌握有关auto_increment 属性的基本知识,还需要熟悉这种机制在各种的数据表类型中的差异。

Mysql 3.23以前的版本仅仅支持比较基础的ISAM 数据表类型,在后来的版本中,其他几种数据表类型也逐步加了进来。包括 MyISAM 和 HEAP 类型等等。现在我们使用 MySQL 的时候默认建立的数据表都是比较先进的MyISAM类型。

我们先看比较基础的IASM表类型是如何看待数据列的 auto_increment属性:

A、如果试图把一个null 值插入到一个 auto_increment 数据列里面,Mysql会自动生成一个序列编号并插入,一般从1开始,依次递增。

B、不要把0插入 auto_increment 数据列里面,我们不推荐这这样做。

C、如果在需要创建一条新纪录的时候,对 auto_increment 数据列明确制定了一个数,会有两种情况存在:1,某个纪录已经使用了这个数,此时Mysql 会报告错误。2,如果没有纪录使用这个数,那么纪录正常插入,以后再插入的新纪录就会以这个编号+1开始!也就是说,我们可以人为地”跳过”一些编号,举例来说,如果插入一个”假”纪录,编号为999 那么以后的纪录就会从1000开始。然后我们就可以删除”假”纪录了。这是个简单的技巧。

D、如果删除了编号最大的纪录。再插入新纪录的时候仍然会使用这个编号!这是ISAM表本身的特点,也就是说,如果把数据表里面的纪录全部干掉的话,新纪录编号将从1开始。

E、last_insert_id() 函数能够返回编号序列中最后一个生成的编号。在某些情况下,我们可以利用这个函数取得当前数据表中最后一个生成的编号。

下面要说的是 Mysql 里面的目前大部分用户使用的MyISAM表类型对 auto_increment数据属性的处理方法。可以看到,这种新的表类型有更大的灵活性,消除了原始的IASM标在处理序列和编号方面的许多缺陷:

A、在MyIASM表里面,一个自动生成的序列编号将严格地依次递增,即使被删掉也不会被再次使用!

B、可以在建立数据表的时候,使用auto_increment=n 选项为序列编号明确地设定一个初始值

C、可以用alter table随时改变MyISAM表中auto_increment的开始值。

其他注意事项:

1、Mysql 提供auto_increment的主要目的是生成一个正整数数据列,所以我们可以把该列声明为unsigned , 这样能够使用的编号范围就多了一倍。

2、auto_increment属性仍然受到具体的数据列的取值范围的限制,比如一个tinyint数据列,编号最大值也只能是127。

3、清除一个表的全部内容会让序列从1开始重新生成。