MySQL设置ID为mysql 非主键字段自增并且自增,删除ID=1的记录,如何使剩下的记录重新从1开始自增?

MYSQL删除表的记录后如何使ID从1开始 | 枫林博客
这个keycdn是不是封国人
谢谢分享,学习了
站长还活着吗?那个无超链接的
体质养生 :
白银 广告设计,儿童养生职位
《人大开幕》内地「十一五」期
当前位置: &
& MYSQL删除表的记录后如何使ID从1开始
博客搬到SAE了,这个还是比较省心的。不用老是为备份担心。开启友情赞助空间无聊了:[
] 一下,精彩文章等着你哦!
MYSQL删除表的记录后如何使ID从1开始
truncate table 你的表名
//这样不但将数据全部删除,而且重新定位自增的字段
delete from 你的表名
dbcc checkident(你的表名,reseed,0)
//重新定位自增的字段,让它从1开始
如果你要保存你的数据,介绍你第三种方法,by QINYI
用phpmyadmin导出数据库,你在里面会有发现哦
编辑sql文件,将其中的自增下一个id号改好,再导入。
-------------------------
truncate命令是会把自增的字段还原为从1开始的,或者你试试把table_a清空,然后取消自增,保存,再加回自增,这也是自增段还原为1的方法。
-----------
MySql数据库唯一编号字段(自动编号字段)
在数据库应用,我们经常要用到唯一编号,以标识记录。在MySQL中可通过数据列的AUTO_INCREMENT属性
来自动生成。MySQL支持多种数据表,每种数据表的自增属性都有差异,这里将介绍各种数据表里的数据
列自增属性。
如果把一个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数据表不支持在一个数据表中使用复合索引来生成多个互不干扰的序列编号。
不可通过CREATE TABLE OR ALTER TABLE的AUTO_INCREMENT=n选项来改变自增初始值。
可重用编号。
支持在一个数据表里使用复合索引来生成多个互不干扰的序列编号。
InnDB数据表
不可通过CREATE TABLE OR 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_
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表就可生成唯一的序列编号。不
会影响其它客户程序的正常表操作。
alter table table_name auto_increment=n;
注意n只能大于已有的auto_increment的整数值,小于的值无效.
show table status like 'table_name' 可以看到auto_increment这一列是表现有的值.
步进值没法改变.只能通过下面提到last_inset_id()函数变通使用
在使用AUTO_INCREMENT时,应注意以下几点:
AUTO_INCREMENT是数据列的一种属性,只适用于整数类型数据列。
设置AUTO_INCREMENT属性的数据列应该是一个正数序列,所以应该把该数据列声明为UNSIGNED,这样序
列的编号个可增加一倍。
AUTO_INCREMENT数据列必须有唯一索引,以避免序号重复。
AUTO_INCREMENT数据列必须具备NOT NULL属性。
AUTO_INCREMENT数据列序号的最大值受该列的数据类型约束,如TINYINT数据列的最大编号是127,如加上
UNSIGNED,则最大为255。一旦达到上限,AUTO_INCREMENT就会失效。
在不用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表就可生成唯一的序列编号。不
会影响其它客户程序的正常表操作。
有两点需要加强注意:
1、只有一列的时候是不行的!
2、自动编号必须作为主键才有效!
已经有8 条评论啦
总访问量:4865582次mysql插入数据后返回自增ID的方法&mysql和oracle插入的时候有一个很大的区别是,oracle支持序列做id,mysql本身有一个列可以做自增长字段,mysql在插入一条数据后,如何能获得到这个自增id的值呢?&方法一:是使用last_insert_id
mysql& SELECT LAST_INSERT_ID();
&&& 产生的ID 每次连接后保存在服务器中。这意味着函数向一个给定客户端返回的值是该客户端产生对影响AUTO_INCREMENT列的最新语句第一个 AUTO_INCREMENT值的。这个值不能被其它客户端影响,即使它们产生它们自己的 AUTO_INCREMENT值。这个行为保证了你能够找回自己的 ID 而不用担心其它客户端的活动,而且不需要加锁或处理。&&&&& 每次mysql_query操作在mysql服务器上可以理解为一次&原子&操作, 写操作常常需要锁表的, 是mysql应用服务器锁表不是我们的应用程序锁表。&&&& 值得注意的是,如果你一次插入了多条记录,这个函数返回的是第一个记录的ID值。&&&&因为LAST_INSERT_ID是基于Connection的,只要每个线程都使用独立的Connection对象,LAST_INSERT_ID函数 将返回该Connection对AUTO_INCREMENT列最新的insert or update*作生成的第一个record的ID。这个值不能被其它客户端(Connection)影响,保证了你能够找回自己的 ID 而不用担心其它客户端的活动,而且不需要加锁。使用单INSERT语句插入多条记录,& LAST_INSERT_ID返回一个列表。&&& LAST_INSERT_ID 是与table无关的,如果向表a插入数据后,再向表b插入数据,LAST_INSERT_ID会改变。&方法二:是使用max(id)&使用last_insert_id是基础连接的,如果换一个窗口的时候调用则会一直返回10如果不是频繁的插入我们也可以使用这种方法来获取返回的id值
select max(id)
这个方法的缺点是不适合高并发。如果同时插入的时候返回的值可能不准确。&方法三:是创建一个存储过程,在存储过程中调用先插入再获取最大值的操作
DELIMITER $$
DROP PROCEDURE IF EXISTS `test` $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `test`(in name varchar(100),out oid int)
insert into user(loginname) values(name);
select max(id)
DELIMITER ;
call test('gg',@id);
方法四:使用@@identity
select @@IDENTITY
&&& @@identity是表示的是最近一次向具有identity属性(即自增列)的表插入数据时对应的自增列的值,是系统定 义的全局变量。一般系统定义的全局变量都是以@@开头,用户自定义变量以@开头。比如有个表A,它的自增列是id,当向A表插入一行数据后,如果插入数据 后自增列的值自动增加至101,则通过select @@identity得到的值就是101。使用@@identity的前提是在进行insert操作后,执行select @@identity的时候连接没有关闭,否则得到的将是NULL值。
方法五:是使用getGeneratedKeys()
Connection conn = ;
Serializable ret =
PreparedStatement state = .;
ResultSet rs=
state.executeUpdate();
rs = state.getGeneratedKeys();
if (rs.next()) {
ret = (Serializable) rs.getObject(1);
} catch (SQLException e) {
总结一下,在mysql中做完插入之后获取id在高并发的时候是很容易出错的。另外last_insert_id虽然是基于session的但是不知道为什么没有测试成功。&&& &方法6:selectkey:
其实在ibtias框架里使用selectkey这个节点,并设置insert返回值的类型为integer,就可以返回这个id值。
SelectKey在Mybatis中是为了解决Insert数据时不支持主键自动生成的问题,他可以很随意的设置生成主键的方式。
不管SelectKey有多好,尽量不要遇到这种情况吧,毕竟很麻烦。
selectKey Attributes
keyProperty
selectKey 语句结果应该被设置的目标属性。
resultType
结果的类型。MyBatis 通常可以算出来,但是写上也没有问题。MyBatis 允许任何简单类型用作主键的类型,包括字符串。
这可以被设置为 BEFORE 或 AFTER。如果设置为 BEFORE,那么它会首先选择主键,设置 keyProperty 然后执行插入语句。如果设置为 AFTER,那么先执行插入语句,然后是 selectKey 元素-这和如 Oracle 数据库相似,可以在插入语句中嵌入序列调用。
statementType
和前面的相 同,MyBatis 支持 STATEMENT ,PREPARED 和CALLABLE 语句的映射类型,分别代表 PreparedStatement 和CallableStatement 类型。
SelectKey需要注意order属性,像Mysql一类支持自动增长类型的数据库中,order需要设置为after才会取到正确的值。
像Oracle这样取序列的情况,需要设置为before,否则会报错。
另外在用Spring管理事务时,SelectKey和插入在同一事务当中,因而Mysql这样的情况由于数据未插入到数据库中,所以是得不到自动增长的Key。取消事务管理就不会有问题。
下面是一个xml和注解的例子,SelectKey很简单,两个例子就够了:
&insert id="insert" parameterType="map"&
insert into table1 (name) values (#{name})
&selectKey resultType="java.lang.Integer" keyProperty="id"&
CALL IDENTITY()
&/selectKey&
上面xml的传入参数是map,selectKey会将结果放到入参数map中。用POJO的情况一样,但是有一点需要注意的是,keyProperty对应的字段在POJO中必须有相应的setter方法,setter的参数类型还要一致,否则会报错。
@Insert("insert into table2 (name) values(#{name})")
@SelectKey(statement="call identity()", keyProperty="nameId", before=false, resultType=int.class)
int insertTable2(Name name);
上面是注解的形式。
方法:7:使用&insert中的useGeneratedKeys 和keyProperty 两个属性
1.在Mybatis Mapper文件中添加属性&useGeneratedKeys&和&keyProperty&,其中keyProperty是Java对象的属性名,而不是表格的字段名。
2.Mybatis执行完插入语句后,自动将自增长值赋值给对象systemBean的属性id。因此,可通过systemBean对应的getter方法获取!
【注意事项】
1.Mybatis Mapper 文件中,&useGeneratedKeys&和&keyProperty&必须添加,而且keyProperty一定得和java对象的属性名称一直,而不是表格的字段名
2.java Dao中的Insert方法,传递的参数必须为java对象,也就是Bean,而不能是某个参数。
本文转自/duanxz/p/3862356.html 感谢作者
阅读(...) 评论()数据库表主键自动增长列id的极限是多少?长度应该设置为多少? 增长从1开始_百度知道
数据库表主键自动增长列id的极限是多少?长度应该设置为多少? 增长从1开始
int类型等数字类型就可以了一般数据库所谓的自增列都是通过序列来完成,引用序列的字段可以定为number类型,不循环
所以极限就看你自己怎么定义了。长度的话。创建序列的语句为CREATE SEQUENCE nameINCREMENT BY 1 -- 每次加几个 START WITH 1 -- 从1开始计数 NOMAXVALUE -- 不设置最大值 或者MAXVALUE xxxxxNOCYCLE -- 一直累加
如果不设置最大值,那就没有极限了吗?这张表就可以随便存储数据了么?那么可以存储^(这个数随便写的,)条么? 或者比这个数字更大呢?也可以么? 那主键的变化是什么样子呢?
看你主键的那个字段类型是什么,支不支持^这种数据级的数字,无限大的程度是由你机器决定的。真正使用的时候,还要看实际的业务需求!
采纳率:61%
和哪种数据库有关系。通常, 数据库的INT (或INTEGER)数据类型存储从-2的31次方 (-2 ,147 ,483 ,648) 到2的31次方-1 (2 ,147 ,483,647) 之间的所有正负整数。一般长度不需要设置,系统自动的,你只需要指定类型就行了。
就拿mysql来说吧,如果数据的条数超过
-2的31次方(-2 ,147 ,483 ,648) 到2的31次方-1 (2 ,147 ,483,647) 之间的所有正负整数的个数呢? 那么主键是怎么变化呢?
int不够了就改为bigint。再不够了就用GUID。GUID 的格式为“xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”,其中每个 x 是 0-9 或 a-f 范围内的一个32位十六进制数。例如:2F9619FF-8B86-D011-B42D-00C04FC964FF 。这下肯定够了吧。mysql没有这个guid,不过可以用算法生成。 其实int应该就够了,数据太大的话就应该分区了,不能把这么多数据放一个表里。
看你的ID的数据类型int就是int的范围bigint就是bigint的范围如果id是tityint当然只有到255
如果数据达到最大,再有数据会怎么样呢?
那么数据就存不上了么?
为您推荐:
其他类似问题
等待您来回答

我要回帖

更多关于 mysql 自增主键 的文章

 

随机推荐