精华内容
下载资源
问答
  • MYSQL自增主键ID重置

    2021-08-10 17:02:53
    MYSQL在创建一个带有自增主键ID的表时,通常在删除数据时,导致自增主键不连续了。使用下面的SQL脚本可以重置主键。 SET @tableName = 'table_name'; SET @rownum = 0; UPDATE @tableName SET id = @rownum := @...

    MYSQL在创建一个带有自增主键ID的表时,通常在删除数据时,导致自增主键不连续了。使用下面的SQL脚本可以重置主键。

    -- 1、重置已有数据主键
    SET @rownum = 0;
    UPDATE table_name SET id = @rownum := @rownum +1;
    
    -- 2、修改自增主键,beginIndex为查询出来的最大id+1
    SELECT max(id)+1 from table_name;
    alter table table_name auto_increment= beginIndex;
    
    展开全文
  • mysql自增主键ID重置

    2017-08-01 10:43:00
    自增ID 重新从0 开始增长 ALTER TABLE 表名 AUTO_INCREMENT=1; 转载于:https://www.cnblogs.com/mask-v/p/7267236.html

    自增ID 重新从0 开始增长

    ALTER TABLE 表名 AUTO_INCREMENT=1;

    转载于:https://www.cnblogs.com/mask-v/p/7267236.html

    展开全文
  • MySql自增主键ID重置这个坑货

    千次阅读 2020-08-03 09:37:48
    这两天在面试的时候被问到一个问题:在mysql中用自增列作为主键时,先往表里插入5条数据,此时表里数据id为1、2、3、4、5,如果此时删除id=4、5的数据后,再重启数据库,重启成功后向表里insert数据的时候,INNODB、...

    这两天在面试的时候被问到一个问题:在mysql中用自增列作为主键时,先往表里插入5条数据,此时表里数据id为1、2、3、4、5,如果此时删除id=4、5的数据后,再重启数据库,重启成功后向表里insert数据的时候,INNODB、MyISAM引擎下ID分别是从几开始增加?当时被问到这个问题时,一脸懵逼,MD谁有事没事去重启线上数据库嘛。最后还是基础知识不牢固,在此作个笔记。

    MySQL通常使用的引擎都是INNODB,在建表时,一般使用自增列作为表的主键,这样的表对提高性能有一定的帮助。但是自增列有一个坑,并且这个坑存在了很久,一直到MySQL 8.0版本,才修复了这个坑,这个坑就是表的自增列变量auto_increment在MySQL重启后,有可能丢失。

    • innodb引擎(低版本):Innodb表中把自增列作为主键ID时,自增列是通过auto-increment计数器实现的,计数器的最大值是记录到内存中的,重启数据库后,会导致auto-increment计数器重置,从而会导致主键ID重置。

    • MyISam引擎:MyISAM表会把自增列(auto-increment计数器)最大值是记录到数据文件里,重启MySQL自增列(计数器)最大值不会丢失,从而使用自增列作为主键ID时也不会丢失。

    1.innodb主键重置问题

    在 MySQL低版本中,InnoDB表中使用自增的 auto-increment计数器 会把值存放在内存中,不会写入磁盘。一旦MySQL 服务重启,这个值就丢了,InnoDB 引擎会根据表中现有的数据重新计算该计数器的值:获取表中最大的自增主键ID作为auto-increment计数器的最大计数,当insert数据时,在auto-increment计数器最大值上1。

    先创建一张user表,新增几条数据:

    //1.创建user表:自增列作为主键ID
    CREATE TABLE `user` (
      `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
      `name` varchar(255) NOT NULL DEFAULT '',
      `age` int(4) unsigned NOT NULL DEFAULT '0',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
    
    //2.插入5条数据
    INSERT INTO `user`(`name`, age) VALUES('刘备1', 21);
    INSERT INTO `user`(`name`, age) VALUES('刘备2', 22);
    INSERT INTO `user`(`name`, age) VALUES('刘备3', 23);
    INSERT INTO `user`(`name`, age) VALUES('刘备4', 24);
    INSERT INTO `user`(`name`, age) VALUES('刘备5', 25);

    (1)场景一

    mysql数据库不重启时,innodb自增主键ID会根据auto-increment计数器一直递增。

    向user表里插入5条数据,主键ID按自增列通过auto-increment计数器实现自增。

    在user表里删除id为4、5的数据,再向user表中插入一条数据,主键ID是auto-increment的值6。

    (2)场景二

    mysql数据库重启后,innodb自增主键ID会根据auto-increment计数器的重置而重置。

    在场景一的基础上,在删除id为6、3的数据后,此时auto-increment计数器的值为7,user表里的id最大是2。

    然后重启数据库后,auto-increment计数器的值变为3,也就是user表里的自增列ID的最大值2加1。

    此时在插入数据时,自增ID会从3开始自增。Innodb表中把自增列作为主键ID时,在mysql重启后就会存在ID重置问题。删除数据后,再重启,AUTO_INCREMENT会查询表里最大ID并进行重置,重置后和重启前AUTO_INCREMENT计数器的值不同。在MyISAM引擎表中的自增列不会存在这个问题。

    2.MySQL 8.0 auto-increment 计数器逻辑

    在 MySQL 8.0 中,这个计数器的逻辑变了:每当计数器的值有变,InnoDB 会将其写入 redo log,保存到引擎专用的系统表中。MySQL 正常关闭后重启:从系统表中获取计数器的值。MySQL 故障后重启:从系统表中获取计数器的值;从最后一个检查点开始扫描 redo log 中记录的计数器值;取这两者的最大值作为新值。

    3.总结

    (1)如果mysql重启了,那么innodb表在启动后,AUTO_INCREMENT值会自动检测出、并重置为当前表中自增列的最大值+1。

    (2)假如一个表里AUTO_INCREMENT计数器的值是10,此时执行update table set id = 15 where id = 9后,如果这时再继续插入数据,到了自增ID=15的时候是会报错。但是这个时候继续插入,就不会报错。因为刚才即使报错了,AUTO_INCREMENT的值依旧会增加。

    (3)现在使用的一般都是innodb引擎,如果将myisam引擎转换过来的时候,一定要小心这个引擎在自增id上的不同表现。在主从使用不同引擎的时候,也会出现问题,最好将引擎改完一致性的。

    参考:《Be Careful With MySQL's auto_increment. How We Ended Up Losing Data

     

                                                                                           2020年08月03号 早 于 北京记

    展开全文
  • MySQL重置自增主键

    千次阅读 2019-04-23 17:06:33
    1. 重置自增主键 重置表的自增主键: alter table 表名 auto_increment= 起始值 修改表的主键从1开始: SET @rownum = 0; UPDATE 表名 SET id = @rownum := @rownum +1;
    1. 重置自增主键
    重置表的自增主键:
    alter table 表名 auto_increment= 起始值
    修改表的主键从1开始:
    SET @rownum = 0;
    UPDATE 表名 SET id = @rownum := @rownum +1;
    
    展开全文
  • Mysql 自增主键

    2021-05-30 18:51:55
    整型结合属性 auto_increment,可以实现自增功能,但在表结构设计时用自增主键,希望你特别要注意以下两点,若不注意,可能会对业务造成灾难性的打击: 用 BIGINT 做主键,而不是 INT; 自增值并不持久化,可能会...
  • ALTER TABLE table_name AUTO_INCREMENT = 1; 转载于:https://www.cnblogs.com/weilovehua/p/10019491.html
  • MySQL 自增ID 重置问题

    千次阅读 2019-03-24 14:11:01
    innodb引擎:Innodb表把自增主键的最大ID记录到内存中,重启数据库后,都会导致最大自增ID重置。(据说8.0 会保存自增的最大ID到表里,待验证)第一种情况:删除的空洞数据后面没有数据,重启后,AUTO_INCREMENT会...
  • 首先执行 show create table 'your_table_name' 查看目前的 AUTO_INCREMENT 的值 ` 结果会输出 如下语句 CREATE TABLE `your_table_name`...数据库引擎会保证总是使用当前最大的ID值+1,因此如果希望重置Id ,需要自行.
  • mysql自增id 重置

    2019-05-16 15:16:19
    tableName(表名称),columnName(自增列名称) 1、删除自增列 alter table tableName drop columnName;--删除自增列 2、添加自增列 ...alter table tableName add ...3、设置为主键自增 alter table table...
  • int 最大值 int 为4个字节存储 在 signed中,首位的 bit 用来表示符号, 最大值为 2^31−1=2147483647 在 unsigned 中,无需首位 bit 表示符号,最大值为 2^32−1=4294967295 以有符号为例,创建一张表t1,自增初始...
  • 按照删除情况,如果这张表的数据每天是都可以全部删除的话,其实最好不要用delete删除,这样自增主键是不会被重置的。可以考虑用 truncate table 这个去删除,而且truncate比delete是要快的。显然我这不适用。 这...
  • 在对数据库进行操作的时候,数据库的表里的id是自增的,当数据被删除或者添加或者插入失败时,id会一直增上去,变得很乱,不会按照顺序,下面是两种解决办法: alter table tablename drop column id; alter ...
  • alter table tt auto_...mysql> select * from tt; +----+ | id | +----+ | 1 | | 2 | | 3 | | 4 | | 5 | | 6 | | 7 | | 8 | | 9 | +----+ 9 rows in set (0.00 sec) 删除两条数据,再次添加后断层了 my...
  • 1.自增主键为什么会用完 因为计算机里数的大小是有上限的。 2.达到上限会出现什么情况 2.1 在表结构中定义的自增id 达到上限后,自增id不变,这就会造成错误。 因此,在建表的时候需要考察表是否有可能达到这个上限...
  • 生成mysql全局自增主键工具类 import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.concurrent.atomic.AtomicInteger; /**获取mysql全局自增主键 getSeq() ...
  • mysql自增id主键在大量删除后如何重置id避免断层直接上SQL语句: 直接上SQL语句: /删除原有主键/ ALTER TABLE discern_info DROP id; /添加新主键字段/ ALTER TABLE discern_info ADD id MEDIUMINT( 8 ) NOT NULL ...
  • MySQL数据库自增主键归零的几种方法

    千次阅读 2017-03-07 10:44:09
    MySQL自增主键归零的方法: 如果曾经的数据都不需要的话,可以直接清空所有数据,并将自增字段恢复从1开始计数: truncate table table_name;  2. 当用户没有truncate的权限时且曾经的数据不需要时...
  • PostgreSQL 自增主键MySQL的对比 一、创建自增主键 1. MySQL 创建自增主键sql: CREATE TABLE test ( id int(10) unsigned NOT NULL AUTO_INCREMENT, PRIMARY KEY (`id`) ) 2. PostgreSQL 创建自增主键sql...
  • Oracle数据库没有像Mysql那样可以直接设置主键自增,如果要实现自增的话,可以通过序列+触发器来实现。 创建自动增长序列* tb_seq为序列名 create sequence tb_seq minvalue 1 maxvalue 99999999 -设置最大值和...
  • mysql 变更自增主键id起始值

    千次阅读 2020-04-03 15:12:57
    目录 account 库 user 表结构 获取自增id字段的下一个值 修改自增id字段的初始值 其他 SQL 说明 参考文档 account 库 user 表结构 CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID', `name...
  • mysql 重置主键自增的值

    千次阅读 2017-07-07 10:34:28
    mysql自增主键在大量删除后如何重新设置避免断层 alert table name auto-increment = n 本人在测试的时候发现如果表中主键为1---12;34--35 ;当设置n为13时,n会默认为36, 说明本语句只能设定自增值为表中...
  • innodb引擎:Innodb表把自增主键的最大ID记录到内存中,重启...MyISam引擎:MyISAM表会把自增主键的最大ID记录到数据文件里,重启MySQL自增主键的最大ID也不会丢失。 alter table tablename auto_increment = 11; /...
  • 点击上方“方志朋”,选择“设为星标”回复”666“获取新整理的面试文章转自:真没什么逻辑/Draveness当我们在使用关系型数据库时,主键(Primary Key)是无法避开的概念,主键...
  • 数据库重置自增主键

    2021-04-19 15:42:56
    SQLServer:DBCC CHECKIDENT (表名,reseed,0) MySQL:ALTER TABLE 表名 AUTO_INCREMENT = 1
  • MySQL自增主键不连续之解决方案。

    万次阅读 2017-10-05 13:42:12
    假设在一MySQL数据表中,自增的字段为id,唯一字段为abc,还有其它字段若干。 自增:AUTO_INCREMENT A、使用insert into插入数据时,若abc的值已存在,因其为唯一键,故不会插入成功。但此时,那个AUTO_...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,954
精华内容 1,181
关键字:

mysql自增主键重置

mysql 订阅