首页 > 数据库 > MySQL > 正文

Mysql设置自增长主键的初始值

2024-07-24 12:36:34
字体:
来源:转载
供稿:网友

本文章是由一个简单的Mysql自增初始值的一个例子引导出大量的关于mysql主键获取 修改及一些常用的例子,下面我们一起来看看希望例子对各位会有帮助.

alter table table_name auto_increment=n;

注意n只能大于已有的auto_increment的整数值,小于的值无效.

show table status like 'table_name' 可以看到auto_increment这一列是表现有的值,步进值没法改变,只能通过下面提到last_inset_id()函数变通使用.

Mysql可以使用AUTO_INCREMENT来设定主键的值为自增长的,其默认值是1,如果想把它的初始值设置为1000,比较笨的办法是先插入一条记录并指定主键的值为999,然后delete改行记录,代码如下:

insert into test(pk) values(999);delete from test where pk = 999;

更好的方法是使用alter的方法来直接修改.例如:

alter table test AUTO_INCREMENT = 1000;

1、不控制主键的起点,代码如下:

  1. create table emb_t_dictBusType 
  2.    emb_c_busTypeID      int not null auto_increment, 
  3.    emb_c_busTypeEnName  varchar(255) not null
  4.    emb_c_busTypeZhName  varchar(255) not null
  5.    primary key(emb_c_busTypeID)   
  6. )engine=INNODB  default charset=gbk;  

2、控制主键的起点,代码如下:

  1. create table emb_t_dictBusType 
  2.    emb_c_busTypeID      int not null auto_increment, 
  3.    emb_c_busTypeEnName  varchar(255) not null
  4.    emb_c_busTypeZhName  varchar(255) not null
  5.    primary key(emb_c_busTypeID)   
  6. )engine=INNODB auto_increment=1001 default charset=gbk; 

自增主键归零

方法一:如果曾经的数据都不需要的话,可以直接清空所有数据,并将自增字段恢复从1开始计数.truncate table 表名

方法二:

dbcc checkident (’table_name’, reseed, new_reseed_value) 当前值设置为 new_reseed_value。如果自创建表后没有将行插入该表,则在执行 DBCC CHECKIDENT 后插入的第一行将使用 new_reseed_value 作为标识。否则,下一个插入的行将使用 new_reseed_value + 1。如果 new_reseed_value 的值小于标识列中的最大值,以后引用该表时将产生 2627 号错误信息.

方法二不会清空已有数据,操作比较灵活,不仅可以将自增值归零,也适用于删除大量连续行后,重新设置自增值并插入新的数据;或从新的值开始,当然不能和已有的冲突,代码如下:

  1. $sql="delete from $table_vote";  
  2. mysql_query($sql, $link);  
  3. $sql="alter table $table_vote auto_increment=1";  
  4. mysql_query($sql, $link); 

获取自增主键【4种方法】

通常我们在应用中对mysql执行了insert操作后,需要获取插入记录的自增主键。本文将介绍java环境下的4种方法获取insert后的记录主键auto_increment的值:

通过JDBC2.0提供的insertRow()方式

通过JDBC3.0提供的getGeneratedKeys()方式

通过SQL select LAST_INSERT_ID()函数

通过SQL @@IDENTITY 变量

1. 通过JDBC2.0提供的insertRow()方式,自jdbc2.0以来,可以通过下面的方式执行,代码如下:

  1. Statement stmt = null; 
  2. ResultSet rs = null; 
  3. try { 
  4.     stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,  // 创建Statement 
  5.                                 java.sql.ResultSet.CONCUR_UPDATABLE); 
  6.     stmt.executeUpdate("DROP TABLE IF EXISTS autoIncTutorial"); 
  7.     stmt.executeUpdate(      // 创建demo表 
  8.             "CREATE TABLE autoIncTutorial (" 
  9.             + "priKey INT NOT NULL AUTO_INCREMENT, " 
  10.             + "dataField VARCHAR(64), PRIMARY KEY (priKey))"); 
  11.     rs = stmt.executeQuery("SELECT priKey, dataField " // 检索数据 
  12.        + "FROM autoIncTutorial"); 
  13.     rs.moveToInsertRow();     // 移动游标到待插入行(未创建的伪记录) 
  14.     rs.updateString("dataField""AUTO INCREMENT here?");   // 修改内容 
  15.     rs.insertRow();           // 插入记录 
  16.     rs.last();            // 移动游标到最后一行 
  17.     int autoIncKeyFromRS = rs.getInt("priKey");   // 获取刚插入记录的主键preKey 
  18.     rs.close(); 
  19.     rs = null; 
  20.     System.out.println("Key returned for inserted row: " 
  21.         + autoIncKeyFromRS); 
  22. }  finally { 
  23.     // rs,stmt的close()清理 
  24. //开源代码Vevb.com 

2. 通过JDBC3.0提供的getGeneratedKeys()方式,代码如下:

  1. Statement stmt = null; 
  2. ResultSet rs = null; 
  3. try { 
  4.     stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, 
  5.                                 java.sql.ResultSet.CONCUR_UPDATABLE);   
  6.     // ... 
  7.     // 省略若干行(如上例般创建demo表) 
  8.     // ... www.Vevb.com 
  9.     stmt.executeUpdate( 
  10.             "INSERT INTO autoIncTutorial (dataField) " 
  11.             + "values ('Can I Get the Auto Increment Field?')"
  12.             Statement.RETURN_GENERATED_KEYS);                      // 向驱动指明需要自动获取generatedKeys! 
  13.     int autoIncKeyFromApi = -1; 
  14.     rs = stmt.getGeneratedKeys();                                  // 获取自增主键! 
  15.     if (rs.next()) { 
  16.         autoIncKeyFromApi = rs.getInt(1); 
  17.     }  else { 
  18.         // throw an exception from here 
  19.     }  
  20.     rs.close(); 
  21.     rs = null; 
  22.     System.out.println("Key returned from getGeneratedKeys():" 
  23.         + autoIncKeyFromApi); 
  24. }  finally { ... }  

使用AUTO_INCREMENT时,应注意以下几点:

AUTO_INCREMENT是数据列的一种属性,只适用于整数类型数据列.

设置AUTO_INCREMENT属性的数据列应该是一个正数序列,所以应该把该数据列声明为UNSIGNED,这样序列的编号个可增加一倍.

AUTO_INCREMENT数据列必须有唯一索引,以避免序号重复.

AUTO_INCREMENT数据列必须具备NOT NULL属性.

AUTO_INCREMENT数据列序号的最大值受该列的数据类型约束,如TINYINT数据列的最大编号是127,如加上UNSIGNED,则最大为255,一旦达到上限,AUTO_INCREMENT就会失效.

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表