`
kaindy7633
  • 浏览: 80641 次
  • 性别: Icon_minigender_1
  • 来自: 绵阳
社区版块
存档分类
最新评论

【转】MYSQL删除表的记录后如何使ID从1开始

阅读更多
MYSQL删除表的记录后如何使ID从1开始

http://hi.baidu.com/289766516/blog/item/a3f85500556e2c09728da5e1.html 

2009-11-30 14:24

方法1:
truncate table 你的表名
//这样不但将数据全部删除,而且重新定位自增的字段

方法2:
delete from 你的表名
dbcc checkident(你的表名,reseed,0)
//重新定位自增的字段,让它从1开始

方法3:
如果你要保存你的数据,介绍你第三种方法,by QINYI
用phpmyadmin导出数据库,你在里面会有发现哦
编辑sql文件,将其中的自增下一个id号改好,再导入。

 

-------------------------

truncate命令是会把自增的字段还原为从1开始的,或者你试试把table_a清空,然后取消自增,保存,再加回自增,这也是自增段还原为1 的方法。

 

 

-----------

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选项来改变自增初始值。

不可重用编号。

不支持在一个数据表里使用复合索引来生成多个互不干扰的序列编号。

在使用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表就可生成唯一的序列编号。不

会影响其它客户程序的正常表操作。

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、自动编号必须作为主键才有效!

分享到:
评论

相关推荐

    mysql自增字段重排 mysql删除表后自增字段从1开始.pdf

    - 使用`TRUNCATE TABLE`命令会清空整个表,并将自增字段重置为1,适合用于彻底清除表数据而不只是删除记录。 - 如果只想清空表并重置自增字段,可以先取消自增属性,保存后再重新启用,这也可将自增字段重置为1。 ...

    mysql的插入问题 怎么获得自动增长的ID

    - **MyISAM**:由于MyISAM使用独立的文件存储自动增长的ID值,即使在删除了一些记录并重启MySQL服务后,新的记录ID也会继续从上一个最大ID值加1开始计算,即第18条记录的ID将是18。 - **InnoDB**:重启MySQL服务后,...

    mysql删除数据记录PPT

    在MySQL数据库管理中,删除数据记录是数据操纵语言(DML)的重要组成部分,涉及的关键操作是使用`DELETE`语句。本章主要聚焦于如何利用`DELETE`语句有效地从数据表和视图中移除数据。以下是关于`DELETE`语句在不同...

    mysql自增字段重排 mysql删除表后自增字段从1开始.docx

    MyISAM表不重用删除的最大编号,而HEAP表(从MySQL 4.1开始支持自增)和BDB表则可以重用。InnoDB表不支持通过`CREATE TABLE`或`ALTER TABLE`语句改变自增初始值,且删除的自增值不可重用。 创建复合索引可以在同...

    mysql清除记录数

    1.mysql清空表语句后,新插入的语句会ID会以之前存在的序号记录下去,使用truncate命令清除记录,新插入的语句从1开始 示例: mysql> select id from t1; +----+ | id | +----+ | 1 | | 2 | | 3 | +----+ 清空表 ...

    MySQL删除表数据 MySQL清空表命令 3种方法

    在MySQL数据库管理中,删除表数据是常见的操作,这可能是为了清理旧数据、测试环境的重置或数据更新。本文将详细介绍三种不同的方法来删除MySQL中的表数据,帮助你更有效地管理数据库。 ### 方法一:TRUNCATE TABLE...

    mysql数据表导出为word文档工具

    MySQL 数据表导出为 Word 文档工具是软件开发中一个重要的工具,能够将 MySQL 数据库中的数据表导出为 Word 文档,使得数据库的记录和管理更加方便。 MySQL 数据库连接 在使用该工具之前,需要先建立 MySQL 数据库...

    删除数据表中重复记录

    此步骤基于临时表`tmp`中的记录ID,从原始表`a`中删除对应的重复记录。 为了保持数据库的整洁,还需要删除临时表`tmp`: ```sql DROP TABLE tmp; ``` 至此,整个删除重复记录的过程就完成了。 #### MySQL、SQL ...

    MySql练习1:创建数据库表news.zip

    在这个"MySql练习1:创建数据库表news.zip"中,我们将探讨如何创建一个名为`news`的数据库表。MySQL是一种关系型数据库管理系统,它允许用户通过SQL(结构化查询语言)来存储、检索和管理数据。 首先,让我们了解...

    通过存储过程删除Mysql数据库表中的重复记录.pdf

    - `v_duplicate_last_id`:上次处理的记录ID。 - `v_do`:标记游标是否到达了最后一个值。 - `v_id`, `v_title`, `v_order`:从游标中获取的当前记录的ID、标题和`order`值。 2. **DECLARE CURSOR**: 创建一个...

    实验训练1 在MySQL中创建数据库和表.docx

    "MySQL数据库创建和表创建" 本教程将指导您在MySQL中创建数据库和表,首先需要安装和配置MySQL数据库。 1. MySQL的安装和配置 在安装MySQL之前,需要下载MySQL安装文件,例如mysql-5.5.12-win32.msi。运行该程序...

    省市区数据表mysql

    同样,每个区域有一条记录,字段包括`id`、`area_name`(区域名称)、`city_id`(外键,引用`cities`表的`id`)。这样,通过`city_id`,我们可以找出属于特定城市的所有区域。 为了方便查询和操作,这些表可能还会...

    MYSQL删除表中的指定ID数据

    您可能感兴趣的文章:完全卸载mysql(停止服务、卸载相关程序、删除注册表mysql表的清空、删除和修改操作详解mysql支持跨表delete删除多表记录MySQL删除表数据的方法MySQL实现快速删除所有表而不删除数据库的方法...

    mysql表的入门操作

    而`DELETE FROM`用于删除满足特定条件的记录,如移除ID为1的学生: ```sql DELETE FROM Students WHERE ID = 1; ``` 在实际应用中,我们还需要掌握索引的创建和使用,以提升查询效率;了解事务处理,保证数据的一致...

    mysql 地区表 地址库

    1. **表结构**:地区表通常会有字段如`id`(区域ID)、`parent_id`(父区域ID,用于建立层级关系)、`name`(区域名称)、`level`(区域级别)、`code`(区域编码,如GB/T 2260标准编码)等。 2. **数据插入**:SQL...

    MySQL删除表数据的方法

    在MySQL数据库管理中,删除表数据是常见的操作,主要分为两种方法:DELETE语句和TRUNCATE TABLE语句。这两种方法各有特点,适用于不同的场景。 首先,DELETE语句提供了更大的灵活性,因为它允许通过WHERE子句指定...

    MySQL多表操作说明1

    1. 解除主从表之间的约束关系,然后先删除从表中相关联的记录,最后删除主表中的记录。 2. 或者,可以使用`ON DELETE CASCADE`选项在创建外键约束时,设置当主表记录被删除时,自动删除从表中对应的记录。 其次,子...

    中国行政区mysql表及数据

    采用一个表记录行政、行政区代码、邮编等信息 CREATE TABLE `sys_china_regions` ( `id` int(11) NOT NULL AUTO_INCREMENT '也是行政区代码', `name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL ...

    国家开放大学 MySQL数据库应用 实验训练3 数据增删改操作

    在实验中,学生将学习使用 Delete 语句删除数据,包括删除指定记录和清空表数据。 Delete 语句可以根据条件删除记录,而 TRUNCATE TABLE 语句可以清空表中的所有记录。学生将学习如何使用 Delete 语句删除数据,并...

Global site tag (gtag.js) - Google Analytics