首页 > 数据库 >mysql 如何修改主键起始值?

mysql 如何修改主键起始值?

时间:2023-02-14 10:07:20浏览次数:37  
标签:增值 最大值 我们 起始值 mysql 建表 主键

1.情景展示

在实际开发中,往往会存在这种需求:

将A表当中的数据导入B表,后面继续使用B表。

由上一篇,我们了解到:

B表如果是通过create table b as select * from a的方式,将会导致的其中一个结果就是:

B表没有指定主键列。

mysql 如何修改主键起始值?_Navicat

2.具体分析

现在的问题在于:

假如,我们现在还将ID列作为主键,并且设置成自增列的话,该ID的起始值将是多少?

一起来实际操作一下吧:

第一步:将ID列设置成主键;

mysql 如何修改主键起始值?_自增_02

第二步:取消勾选“自动递增”;

mysql 如何修改主键起始值?_mysql_03

第三步:将主键列的默认值清空。

mysql 如何修改主键起始值?_自增_04

点击保存。

使用建表语句,看一下序列的起始值;

mysql 如何修改主键起始值?_mysql_05

序列的起始值为:9;

我们再来运行一下建表语句:

show CREATE TABLE cz_jkdic_bak;

添加主键前:

mysql 如何修改主键起始值?_主键_06

添加主键后:

mysql 如何修改主键起始值?_mysql_07

\

我们可以看到:

建表语句,除了增加了主键列外,还设置了自增的起始值:AUTO_INCREMENT=9。

我们来看一下当前主键列的最大值:

mysql 如何修改主键起始值?_主键_08

最大值为8,这,也就是说:mysql会自动将现有主键列的最大值+1,当作自增的起始值;

这一点还是非常不错的,这样一来,我们就无需担心主键冲突的问题,也不用手动去改主键序列的起始值啦。

3.解决方案

如何修改主键起始值?

错误方式一:修改AUTO_INCREMENT;

语法:

ALTER TABLE 表名 AUTO_INCREMENT=起始值

mysql 如何修改主键起始值?_自增_09

显示执行成功,我们再可以查看一下建表语句;

mysql 如何修改主键起始值?_自增_10

2022年5月23日19:24:32

虽然,建表语句的自增长起始值发生了改变,但是,然并卵。

我们在插入数据的时候,主键依然按照原来的值的基础上+1(8+1)。

在mysql客户端当中,有一个bug会让我们这样的错觉:

误以为,这种方式值有效的。

mysql 如何修改主键起始值?_自增_11

诚然,在Navicat当中,进行新增的时候,是生效的。

mysql 如何修改主键起始值?_主键_12

但是,我们切换到对象,可以看到该表的自增值。

mysql 如何修改主键起始值?_Navicat_13

我们可以清楚的看到:

该表主键列的自增值并未发生改变。

而且,我们操作数据,一般是通过程序操作,而不是直接操作数据库。

同样地,在SQLYog当中,我们再试一次:

mysql 如何修改主键起始值?_mysql_14

选中表,右键,改变表;

mysql 如何修改主键起始值?_自增_15

查看表主键。

mysql 如何修改主键起始值?_自增_16

我们可以看到:表主键的自增值,依旧没有改变。

结论:通过这种实现方式,只对当前客户端有效,并未修改表的主键值,无论是相较与当前数据主键的最大值,将主键值调大或者调小。

当自增值为NULL或0的时候,这种方式会起作用。

mysql 如何修改主键起始值?_Navicat_17

错误方式二:SQLyog工具。

鼠标选中要修改的表,快捷键:F6;

mysql 如何修改主键起始值?_主键_18

自动增量,这一栏就是序列的下一个值;

修改之后,保存。

mysql 如何修改主键起始值?_Navicat_19

虽然显示:已经修改成功,但是,我们会发现:自增值并未发生改变。

mysql 如何修改主键起始值?_Navicat_20

2022年5月23日19:59:07

mysql主键特性:

mysql的自增列,有以下特性:

每次增加的值为1;

在取自增值时,会先去查当前主键的最大值,然后和当前自增值进行比对:

如果,自增值>现有数据主键的最大值,则取自增值,作为新数据的主键;

反之,自增值<=现有数据主键的最大值,则取现有数据主键的最大值+1,作为新数据的主键。

mysql的自增列的值,一般情况下,只会越来越大,是无法人为手动变小的。

正确实现方式:

第一步:复制表;

CREATE TABLE meta_theme_bak as SELECT * FROM meta_theme

我们可以看到:

此时,备份表的自增列的值为0。 

mysql 如何修改主键起始值?_主键_21

 

注意:使用这种复制表的方式,会导致主键、索引等相关信息的丢失。

第二步:删除旧表;

DROP TABLE meta_theme

mysql 如何修改主键起始值?_Navicat_22

 

第三步:对备份表进行重命名;

mysql 如何修改主键起始值?_主键_23

第四步:重新设置表主键、索引、表名注释等相关信息。

mysql 如何修改主键起始值?_Navicat_24

添加主键,并勾选“自动递增”,保存。

随后,我们可以看到,表的主键自增值已经改成了在原有数据最大值的基础上+1。

mysql 如何修改主键起始值?_Navicat_25

还有一种实现方式:清空表数据

mysql 如何修改主键起始值?_自增_26

表数据被清空后,我们依然可以发现:

表的自增值并未发生任何变化。

select
auto_increment
from
information_schema.`tables`
where
table_name = '表名'
and table_schema = '数据库名'

mysql 如何修改主键起始值?_mysql_27

但是,我们在实际插入数据的时候,表主键已经从1重新开始了。

由此可见,表的AUTO_INCREMENT并不可信,只有在实际插入的时候,我们才知道主键会是多少!

写在最后

  哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!



作者:Marydon

标签:增值,最大值,我们,起始值,mysql,建表,主键
From: https://blog.51cto.com/u_15964717/6055544

相关文章

  • mysql 临时表
    1.情景展示在实际开发过程中,当现有手段无法满足我们想要的数据时,我们就可以通过创建临时表,保存一些临时数据的方式,来用作数据的过渡。2.具体分析临时表只在当前连接可见,当关......
  • mysql 日期类型计算
    1.情景展示在进行按日期统计数据的时候,我们经常需要对日期的开始时间和结束时间有要求;在mysql中,日期字段如何进行时间的计算呢?2.to_days()to_days(日期)函数:返回从0000年(公......
  • mysql 快速备份表数据
    1.情景展示在工作过程中,我们往往会有对表数据进行备份的需求,比如说:对表数据进行大量操作时,为了以防万一,最好是将数据进行备份,以免操作不当,导致无法恢复原有的数据。2.解决方......
  • mysql 报错:Every derived table must have its own alias
    1.情景展示使用mysql对派生表查询数据的时候,报错信息如下:Everyderivedtablemusthaveitsownalias使用谷歌翻译成中文:每个派生表都必须有自己的别名。2.具体分析因为习......
  • mysql 获取系统当前时间的3种方式
    1.获取系统当前日期+时间方式一:now()方式二:sysdate()以上两种方式,对应日期类型:datetime。方式三:CURRENT_TIMESTAMP()/CURRENT_TIMESTAMP对应日期类型:timestamp。方式四:to_da......
  • mysql、oracle like查询不走索引的解决方案
    1.情景展示我们知道:无论是mysql还是oracle,只要使用like查询,就可能会面临索引失效(不走索引)的问题;下面,我们将一起来看看什么情况下,索引会失效,以及如何解决不走索引的问题。已......
  • mysql 非空判断(判断字段值是否为空)
    1.情景展示mysql如何判断表字段值是否为空?2.非空判断方式一:表字段+isnotnull方式二:notisnull(表字段)方式三:!isnull(表字段)3.为空判断方式一:表字段+isnull方式二:is......
  • mysql 循环批量建表(表结构相同,表名可以自定义)
    1.情景展示现在有这样一种需求:我需要建两百多张表,这些表的表结构相同,表的名称也是提前拟定好的,必须使用指定的表名;如果使用一个个写SQL语句,那不还得累死,所以,我想到了可不可......
  • mysql limit分页用法讲解
    1.情景展示在Oracle当中,使用rownum来进行分页;而在mysql中,是没有rownum的,需要通过limit来实现。2.用法介绍limit[offset,]rowslimit后面可以跟一个参数,也可以跟两个参数;格式......
  • mysql、oracle 分组查询,每组取一条数据
    1.情景展示有这样一种需求:将数据按照机构进行分组,然后取每个机构下只取一条记录,如何实现?2.mysql分组查询出来某字段,然后和原来的表进行关联查询。方式一:通过内连接来实现查......