mysql自增字段使用技巧(重置与自定义自增字段值)

半年前 494次浏览

前面有介绍过在mysql数据库中创建自增字段,在实际使用过程中自增字段会遇到一些问题。比如:当我们删除表中所有的数据后如何让自增字段再从1开始?又有当我们删除了其中一条数据后,能不能再用刚才删除的自增值插入一条数据呢?

这里我创建一个test表,Id为自增字段,title为文本,以此表作为本文的例表:

CREATE TABLE `test` (
`Id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(255) DEFAULT '',
 PRIMARY KEY (`Id`)
 );
第一个问题,让自增字段从指定的数字开始

默认情况下自增字段创建好后是从1开始的,但是有时侯我们不想从1开始,而是想从10001开始。要如何做呢?

方法一:创建表时通过AUTO_INCREMENT指定自增起始值(如让自增字段从10001开始可以如下创建表)。

CREATE TABLE `test` (
`Id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(255) DEFAULT '',
PRIMARY KEY (`Id`)
)AUTO_INCREMENT=10001;

这样会创建一个test表,Id为自增,插入第一条数据时如果不指定Id值,那么Id值就是10001。

当然如果创建表时忘记指定这个AUTO_INCREMENT值,也可以在创建完表后,通过ALTER TABLE来修改表的AUTO_INCREMENT,如下面的sql可以指定表的AUTO_INCREMENT值:

ALTER TABLE test AUTO_INCREMENT=20001;

方法二:上面有说到插入第一条数据时如果不指定Id值,那么如果我们指定Id值呢?如使用

insert into test (Id,title) values (20001,'测试');

这条SQL里面在向test表插入数据时,自增字段Id也设置了数值,这样就可以指定当前插入数据的Id为指定值,而因为这里插入了一条Id是20001的,那么下一个自增量也就成了20002。

不过:指定自增字段插入数据如果遇到表中已经有了一个相同的自增值的数据就会报错无法插入数据。除非能够确定要插入的数据不会重复,否则这种方法要慎用。

image.png

让自增字段重新从1开始

有些时侯我们删除了一个表里面的所有数据后,想要让自增字段从1开始,要如何操作呢?

如果确定要删除表中所有的数据,可以清空表而不是删除所有的数据。

清空test表>>

truncate test;

删除test表所有数据>>

delete from test;

使用truncate不仅会清空所有的数据,而且还会重置自增字段值让其从1开始。而使用delete的话虽然删除了所有的数据,但是自增字段还是会保留原来的。

当然使用了delete删除所有数据后,还可以使用ALTER TABLE修改表的AUTO_INCREMENT值。如:

delete from test;
ALTER TABLE test AUTO_INCREMENT=1;

这样就是执行了两次操作,第一次删除test表中的所有数据,第二次将test表的自增字段初始值改为1。

删除一条数据后让自增字段不会间段

我有点强近症,如test表中有Id1-5五条数据,当我不得不删除第5条数据后,我还是希望接下来的一条数据Id为5,也可以在删除一条数据后使用ALTER TABLE修改AUTO_INCREMENT值。

ALTER TABLE test AUTO_INCREMENT=5;

这样再插入一条数据其Id也会是5。当然也可以将上面sql语句中的5直接写成1。这样虽然设置的是1,但实际设置的却是最后一个Id值加1。

但是如果我删除的是中间一条数据,如Id为3的数据。再想插入一条Id为3的数据就比较麻烦了。因为即使我使用ALTER TABLE修改AUTO_INCREMENT值为1,其实也是最大的那一个Id值加1。

除非我很肯定知道Id=3的数据是不存在的,使用insert into指定Id值插入数据(因为如果Id=3存在是无法插入数据的)。

以上便是我在建库时对AUTO_INCREMENT的一些使用心得。

百题资料微信二维码
微信公众号
百题资料APP二维码
题库小程序