加入收藏 | 设为首页 | 会员中心 | 我要投稿 常州站长网 (https://www.0519zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MySQL中实现ID编号自动增加的技巧

发布时间:2022-06-15 14:14:51 所属栏目:MySql教程 来源:互联网
导读:自增我们经常利用 mysql工具进行创建数据库这样就可以很方便的实现id字段自增了,下面我们来告诉你具体如何让字段自增的方法。 在数据库应用中我们经常要用到唯一编号。在MySQL中可通过字段的AUTO_INCREMENT属性来自动生成。MySQL支持多种数据表,每种数据表
  自增我们经常利用 mysql工具进行创建数据库这样就可以很方便的实现id字段自增了,下面我们来告诉你具体如何让字段自增的方法。
 
  在数据库应用中我们经常要用到唯一编号。在MySQL中可通过字段的AUTO_INCREMENT属性来自动生成。MySQL支持多种数据表,每种数据表的自增属性都有所不同。
 
  ISAM表
 
  如果把一个NULL插入到一个AUTO_INCREMENT数据列里去,MySQL将自动生成下一个序列编号,编号从1开始,并1为基数递增.
 
  当插入记录时,没有为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选项来修改自增始初值。
 
  编号不可重用。
  
  不支持在一个数据表里使用复合索引来生成多个互不干扰的序列编号。
 
  在使用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;或者  truncate table table_name这是因为进行全表操作时,MySQL实际是做了这样的优化操作:先把数据表里的所有数据和索引删除,然后重建数据表。如果想删除所有的数据行又想保留序列编号信息,可这样用一个带where的delete命令以抑制MySQL的优化:
 
  delete from table_name where 1;这将迫使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(); //phpfensi.com
 
  通过修改seq+1中的常数值,可生成不同步长的序列,如seq+10可生成步长为10的序列。该方法可用于计数器,在数据表中插入多行以记录不同的计数值,再配合LAST_INSERT_ID()函数的返回值生成不同内容的计数值,这种方法的优点是不用事务或LOCK,UNLOCK表就可生成唯一的序列编号,不会影响其它客户程序的正常表操作.
 
 

(编辑:常州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读