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

Mysql学习篇 —— Mysql设置自增长序列的初始值

发布时间:2022-10-14 15:30:44 所属栏目:MySql教程 来源:网络
导读: 本文章是由一个简单的Mysql自增初始值的一个例子引导出大量的关于mysql主键获取 修改及一些常用的例子,下面我们一起来看看希望例子对各位会有帮助。
alter table table_name auto_increme

本文章是由一个简单的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,如果想把它的初始值设置为1000MySQL 序列使用,比较笨的办法是先插入一条记录并指定主键的值为999,然后delete改行记录,例如:

代码如下

复制代码

insert into test(pk) values(999);

delete from test where pk = 999;

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

代码如下

复制代码

alter table test AUTO_INCREMENT = 1000;

例子

1、不控制主键的起点

代码如下

复制代码

create table emb_t_dictBusType

(

emb_c_busTypeID int not null auto_increment,

emb_c_busTypeEnName varchar(255) not null,

emb_c_busTypeZhName varchar(255) not null,

primary key(emb_c_busTypeID)

)engine=INNODB default charset=gbk;

2、控制主键的起点

代码如下

复制代码

create table emb_t_dictBusType

(

emb_c_busTypeID int not null auto_increment,

emb_c_busTypeEnName varchar(255) not null,

emb_c_busTypeZhName varchar(255) not null,

primary key(emb_c_busTypeID)

)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 号错误信息。

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

代码如下

复制代码

$sql="delete from $table_vote";

mysql_query($sql, $link);

$sql="alter table $table_vote auto_increment=1";

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以来,可以通过下面的方式执行。

代码如下

复制代码

Statement stmt = null;

ResultSet rs = null;

try {

stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, // 创建Statement

java.sql.ResultSet.CONCUR_UPDATABLE);

stmt.executeUpdate("DROP TABLE IF EXISTS autoIncTutorial");

stmt.executeUpdate( // 创建demo表

"CREATE TABLE autoIncTutorial ("

+ "priKey INT NOT NULL AUTO_INCREMENT, "

+ "dataField VARCHAR(64), PRIMARY KEY (priKey))");

rs = stmt.executeQuery("SELECT priKey, dataField " // 检索数据

+ "FROM autoIncTutorial");

rs.moveToInsertRow(); // 移动游标到待插入行(未创建的伪记录)

rs.updateString("dataField", "AUTO INCREMENT here?"); // 修改内容

rs.insertRow(); // 插入记录

rs.last(); // 移动游标到最后一行

int autoIncKeyFromRS = rs.getInt("priKey"); // 获取刚插入记录的主键preKey

rs.close();

rs = null;

System.out.println("Key returned for inserted row: "

+ autoIncKeyFromRS);

} finally {

// rs,stmt的close()清理

}

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

代码如下

复制代码

Statement stmt = null;

ResultSet rs = null;

try {

stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,

java.sql.ResultSet.CONCUR_UPDATABLE);

// ...

// 省略若干行(如上例般创建demo表)

// ...

stmt.executeUpdate(

"INSERT INTO autoIncTutorial (dataField) "

+ "values ('Can I Get the Auto Increment Field?')",

Statement.RETURN_GENERATED_KEYS); // 向驱动指明需要自动获取generatedKeys!

int autoIncKeyFromApi = -1;

rs = stmt.getGeneratedKeys(); // 获取自增主键!

if (rs.next()) {

autoIncKeyFromApi = rs.getInt(1);

} else {

// throw an exception from here

}

rs.close();

rs = null;

System.out.println("Key returned from getGeneratedKeys():"

+ autoIncKeyFromApi);

} finally { ... }

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

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

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

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

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

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

(编辑:源码门户网)

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