mysql数据库数据类型⾃动编号选哪个_[mysql]MySql⾃动编号
问题整理
在数据库应⽤,我们经常要⽤到唯⼀编号,以标识记录。在MySQL中可通过数据列的AUTO_INCREMENT属性来⾃动⽣成。MySQL⽀持多种数据表,每种数据表的⾃增属性都有差异,这⾥将介绍各种数据表⾥的数据列⾃增属性。
ISAM表
如果把⼀个NULL插⼊到⼀个AUTO_INCREMENT数据列⾥去,MySQL将⾃动⽣成下⼀个序列编号。编号从1开始,并1为基数递增。
把0插⼊AUTO_INCREMENT数据列的效果与插⼊NULL值⼀样。但不建议这样做,还是以插⼊NULL值为好。
当插⼊记录时,没有为AUTO_INCREMENT明确指定值,则等同插⼊NULL值。
当插⼊记录时,如果为AUTO_INCREMENT数据列明确指定了⼀个数值,则会出现两种情况,情况⼀,如果插⼊的值与已有的编号重复,则会出现出错信息,因为AUTO_INCREMENT数据列的值必须是唯⼀
的;情况⼆,如果插⼊的值⼤于已编号的值,则会把该插⼊到数据列中,并使在下⼀个编号将从这个新值开始递增。也就是说,可以跳过⼀些编号。
如果⾃增序列的最⼤值被删除了,则在插⼊新记录时,该值被重⽤。
如果⽤UPDATE命令更新⾃增列,如果列值与已有的值重复,则会出错。如果⼤于已有值,则下⼀个编号从该值开始递增。
如果⽤replace命令基于AUTO_INCREMENT数据列⾥的值来修改数据表⾥的现有记录,即AUTO_INCREMENT数据列出现在了replace命令的where⼦句⾥,相应的AUTO_INCREMENT值将不会发⽣变化。但如果replace命令是通过其它的PRIMARY KEY OR UNIQUE索引来修改现有记录的(即AUTO_INCREMENT数据列没有出现在replace命令的where⼦句中),相应的AUTO_INCREMENT值--如果设置其为NULL(如没有对它赋值)的话--就会发⽣变化。
last_insert_id()函数可获得⾃增列⾃动⽣成的最后⼀个编号。但该函数只与服务器的本次会话过程中⽣成的值有关。如果在与服务器的本次会话中尚未⽣成AUTO_INCREMENT值,则该函数返回0。
其它数据表的⾃动编号机制都以ISAM表中的机制为基础。MyISAM数据表
删除最⼤编号的记录后,该编号不可重⽤。
可在建表时可⽤“AUTO_INCREMENT=n”选项来指定⼀个⾃增的初始值。
可⽤alter table table_name AUTO_INCREMENT=n命令来重设⾃增的起始值。
可使⽤复合索引在同⼀个数据表⾥创建多个相互独⽴的⾃增序列,具体做法是这样的:为数据表创建⼀个由多个数据列组成的PRIMARY KEY OR UNIQUE索引,并把AUTO_INCREMENT数据列包括在这个索引⾥作为它的最后⼀个数据列。这样,这个复合索引⾥,前⾯的那些数据列每构成⼀种独⼀⽆⼆的组合,最末尾的AUTO_INCREMENT数据列就会⽣成⼀个与该组合相对应的序列编号。
HEAP数据表
HEAP数据表从MySQL4.1开始才允许使⽤⾃增列。
⾃增值可通过CREATE TABLE语句的 AUTO_INCREMENT=n选项来设置。
可通过ALTER TABLE语句的AUTO_INCREMENT=n选项来修改⾃增始初值。
编号不可重⽤。
HEAP数据表不⽀持在⼀个数据表中使⽤复合索引来⽣成多个互不⼲扰的序列编号。
BDB数据表
不可通过CREATE TABLE OR ALTER TABLE的AUTO_INCREMENT=n选项来改变⾃增初始值。
可重⽤编号。
⽀持在⼀个数据表⾥使⽤复合索引来⽣成多个互不⼲扰的序列编号。
InnDB数据表
不可通过CREATE TABLE OR ALTER TABLE的AUTO_INCREMENT=n选项来改变⾃增初始值。
不可重⽤编号。
mysql删除重复的数据保留一条不⽀持在⼀个数据表⾥使⽤复合索引来⽣成多个互不⼲扰的序列编号。
在使⽤AUTO_INCREMENT时,应注意以下⼏点:
AUTO_INCREMENT是数据列的⼀种属性,只适⽤于整数类型数据列。
设置AUTO_INCREMENT属性的数据列应该是⼀个正数序列,所以应该把该数据列声明为UNSIGNED,这样序列的编号个可增加⼀倍。
AUTO_INCREMENT数据列必须有唯⼀索引,以避免序号重复。
AUTO_INCREMENT数据列必须具备NOT NULL属性。
AUTO_INCREMENT数据列序号的最⼤值受该列的数据类型约束,如TINYINT数据列的最⼤编号是127,如加上UNSIGNED,则最⼤为255。⼀旦达到上限,AUTO_INCREMENT就会失效。
当进⾏全表删除时,AUTO_INCREMENT会从1重新开始编号。全表删除的意思是发出以下两条语句时:
delete from table_name;
or
truncate table table_name
这是因为进⾏全表操作时,MySQL实际是做了这样的优化操作:先把数据表⾥的所有数据和索引删除,然后重建数据表。如果想删除所有的数据⾏⼜想保留序列编号信息,可这样⽤⼀个带where的delete命令以抑制MySQL的优化:
delete from table_name where 1;
这将迫使MySQL为每个删除的数据⾏都做⼀次条件表达式的求值操作。
强制MySQL不复⽤已经使⽤过的序列值的⽅法是:另外创建⼀个专门⽤来⽣成AUTO_INCREMENT序列的数据表,并做到永远不去删除该表的记录。当需要在主数据表⾥插⼊⼀条记录时,先在那个专门⽣成序号的表中插⼊⼀个NULL值以产⽣⼀个编号,然后,在往主数据表⾥插⼊数据时,利⽤LAST_INSERT_ID()函数取得这个编号,并把它赋值给主表的存放序列的数据列。如:
insert into id set id = NULL;
insert into main set main_id = LAST_INSERT_ID();
可⽤alter命令给⼀个数据表增加⼀个具有AUTO_INCREMENT属性的数据列。MySQL会⾃动⽣成所有的编号。
要重新排列现有的序列编号,最简单的⽅法是先删除该列,再重建该,MySQL会重新⽣连续的编号序列。
在不⽤AUTO_INCREMENT的情况下⽣成序列,可利⽤带参数的LAST_INSERT_ID()函数。如果⽤⼀个带参数的LAST_INSERT_ID(expr)去插⼊或修改⼀个数据列,紧接着⼜调⽤不带参数的LAST_INSERT_ID()函数,则第⼆次函数调⽤返回的就是expr的值。下⾯演⽰该⽅法的具体操作:
先创建⼀个只有⼀个数据⾏的数据表:
create table seq_table (id int unsigned not null);
insert into seq_table values (0);
接着⽤以下操作检索出序列号:
update seq_table set seq = LAST_INSERT_ID( seq + 1 );
select LAST_INSERT_ID();
通过修改seq+1中的常数值,可⽣成不同步长的序列,如seq+10可⽣成步长为10的序列。
该⽅法可⽤于计数器,在数据表中插⼊多⾏以记录不同的计数值。再配合LAST_INSERT_ID()函数的返回值⽣成不同内容的计数值。这种⽅法的优点是不⽤事务或LOCK,UNLOCK表就可⽣成唯⼀的序列编号。不会影响其它客户程序的正常表操作。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论