-
2021-09-06 16:29:35
在使用mysql过程中,遇见这样一个问题:
假设表A的a字段是int型,从1开始自增。当前主键自增到33了。但下一条数据想让它主键为50,跳过中间的差值。我想当然的认为只要将当前的主键33改为50,那么它的最大主键就是50,之后插入数据就会接着50继续自增。但实际上新插入的数据仍然是接着33开始自增的,而不是修改后的50。
问题原因:
mysql的自增主键并不是每次插入时实时的去现有的数据中查找最大主键的,他的自增主键是保存在mysql的配置(还是缓存)中的(这里我不是很清楚,可能表达有误),总之并非是修改最大逐渐后就会以修改后的主键接着自增。
它还会接着原来的主键自增,直到修改后的,在上面的例子中,新插入数据会一直接着33自增到50,第一次到50的时候会报错主键冲突,再次执行新增就会跳过50,到51,继续自增。
要想实时修改的是有效的,需要重新启动数据库(我没试过,网上查到是这样的);
这个问题是两个数据库做数据同步的时候遇到的,即一边最大主键33,另一边最大主键是51.这边33接着自增的话同步到另一边就会主键冲突,所以需要修改最大主键。故涉及到数据库同步的情况尽量不要用int自增类型做主键,尽量使用随机字符串,可以减少不必要的麻烦。
更多相关内容 -
orcale数据库主键自增,及mysql主键自增
2021-08-18 16:09:15id number(10) primary key, /*主键,自动增加*/ name varchar2(20), /*姓名*/ phone varchar2(20), /*电话*/ sex varchar2(10), /*性别*/ age number(10) /*年龄*/ ); --.创建自增长序列 create s1,orcale数据库主键自增
-- 创建表
create table PERSON( id number(10) primary key, /*主键,自动增加*/ name varchar2(20), /*姓名*/ phone varchar2(20), /*电话*/ sex varchar2(10), /*性别*/ age number(10) /*年龄*/ );
--.创建自增长序列create sequence PERSON_SEQ --minvalue 1 -- 最小值 -- maxvalue 2000 -- 最大值 nomaxvalue -- 不设置最大值 start with 1 -- 从1开始计数 increment by 1 -- 每次增加1 nocycle -- 一直累加,不循环 cache 20;
--在创建自增长序列时,可以设置计数起始位置。例如表中存在100条原始数据,那么我们可以设置 start with 101 ,这样自增长就会从101开始
--删除主键自增:DROP sequence PERSON_SEQ
-- 创建触发器create or replace trigger PERSON before insert on PERSON for each row begin select PERSON_SEQ.nextval into :new.id from dual; end PERSON_TR;
--提交:commit;
insert into person(name,phone,sex,age) values('张三','18888888888','男',25); insert into person(name,phone,sex,age) values('李四','18888888889','男',29);
数据表中添加主键自增,通过sqlplus导入数据时,不会出现如下错误
2,mysql主键自增
create table if not exists `user`( `id` int unsigned auto_increment, --unsigned:既为非负数,用此类型可以增加数据长度! --auto_increment:主键自增设置 `name` varchar(100) not null, `sex` varchar(40) not null, `age` int(11), primary key ( `id` ) )engine=innodb default charset=utf8;
亦可以在使用navicat给数据库表,设计表中,添加主键和自增,操作比orcale数据库操作方便。
-
MySQL的自增ID(主键) 用完了的解决方法
2021-01-21 14:30:32MySQL的自增ID(主键) 用完了,怎么办? 如果用 int unsigned (int,4个字节 ), 我们可以算下最大当前声明的自增ID最大是多少,由于这里定义的是 int unsigned,所以最大可以达到2的32幂次方 – 1 = 4294967295。 ... -
关于 mysql 主键自增问题
2021-02-03 23:04:56MyISam引擎:MyISAM表会把自增列(auto-increment计数器)最大值是记录到数据文件里,重启MySQL自增列(计数器)最大值不会丢失,从而使用自增列作为主键ID时也不会丢失。 MySQL 一般使用 innodb 引擎,数据库重启MySQL 引擎 innodb引擎(低版本):Innodb表中把自增列作为主键ID时,自增列是通过auto-increment计数器实现的,计数器的最大值是记录到内存中的,重启数据库后,会导致auto-increment计数器重置,从而会导致主键ID重置。 MyISam引擎:MyISAM表会把自增列(auto-increment计数器)最大值是记录到数据文件里,重启MySQL自增列(计数器)最大值不会丢失,从而使用自增列作为主键ID时也不会丢失。
MySQL 一般使用 innodb 引擎,数据库重启后,主键自增可能会丢失,因为这个引擎使用 auto-increment计数器进行主键自增,值保存在内存中 MyISam 引擎的值保存在系统表中,不会丢失
查看数据库当前使用的引擎 SHOW ENGINES; 更改引擎方式一: 修改配置文件my.ini 将my-small.ini另存为my.ini,在[mysqld]最后添加为上default-storage-engine=InnoDB,重启服务,数据库默认的引擎修改为InnoDB 更改引擎方式二: 在建表的时候指定或者建完表修改 -- 建表的时候指定 create table mytbl( id int primary key, name varchar(50) )type=MyISAM; -- 建完表后修改 alter table mytbl2 type = InnoDB;
目前只知道通过 SQL 语句对主键自增进行重置 ALTER TABLE account MODIFY id INT; // 取消主键自增 ALTER TABLE account MODIFY id INT AUTO_INCREMENT; // 添加主键自增 至于如何用代码实现 主键自增的重置, 欢迎大家留言
-
mysql主键自增原理,值得推荐!
2021-07-12 07:45:58总结 本文从基础到高级再到实战,由浅入深,把MySQL讲的清清楚楚,明明白白,这应该是我目前为止看到过最好的有关MySQL的学习笔记了,我相信如果你把这份笔记认真看完后,无论是工作中碰到的问题还是被面试官问到的...1、上下文切换
上下文定义
cpu发生进程或者线程切换时,所依赖的数据集合,比如一个函数有外部变量,函数运行时,必须获取外部变量,这些变量值的集合就是上下文。
引发问题
对于CPU密集型任务,多线程处理会发生上下文切换,会影响到执行速度,如果时IO密集型,多线程技术优点尽显。
如何减少上下文切换
- 无锁并发编程,锁的获取与释放会发生上下文切换,多线程时会影响效率。无锁并发编程就是将数据分块,每个线程处理各自模块。比如LongAdder中部分代码。
- CAS算法,并发编程时通过CAS算法更新数据,而不必加锁。如Java的atomic包下的工具类。
- 使用最少线程,减少不必要的线程创建,自定义线程池。
- 使用协程,在单线程中维护多任务调度,处理任务间切换,Golang对于协程的使用很强大。
2、死锁
死锁定义
死锁是进程死锁的简称,是由Dijkstra于1965年研究银行家算法时首先提出来的。
系统发生死锁现象不仅浪费大量的系统资源,甚至导致整个系统崩溃,带来灾难性后果。产生死锁原因
- 系统资源不足
- 进程推进顺序不当
- 资源分配不合理
死锁产生的必要条件
- 互斥条件:一个资源只能被一个进程或者线程使用。
- 请求和保持条件:一个进程或者线程,请求资源的时候发生阻塞,对已经获取的资源保持不放。
- 不可剥夺条件:进程或者线程以获得的资源,在未使用完成时,不能强行剥夺。
- 循环等待条件:若干进程或者线程形成一种头尾相接的循环等待的资源关系。
这四分条件是死锁产生的必要条件,只要发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。
如何避免死锁
- 以确定的顺序获得锁
- 加锁时限
Lock接口提供了boolean tryLock(long time, TimeUnit unit) throws InterruptedException方法,该方法可以按照固定时长等待锁,因此线程可以在获取锁超时以后,主动释放之前已经获得的所有的锁。
总结
本文从基础到高级再到实战,由浅入深,把MySQL讲的清清楚楚,明明白白,这应该是我目前为止看到过最好的有关MySQL的学习笔记了,我相信如果你把这份笔记认真看完后,无论是工作中碰到的问题还是被面试官问到的问题都能迎刃而解!
重要的事:需要领取完整版的MySQL学习笔记的话,请转发+关注后点这里免费获取到免费的下载方式!
MySQL50道高频面试题整理:
com/vip204888/java-p7)到免费的下载方式!**
MySQL50道高频面试题整理:
-
mysql主键自增
2022-02-18 16:05:25–mysql – 设置自增ID从N开始 CREATE TABLE tablename( ID INT PRIMARY KEY AUTO_INCREMENT ) AUTO_INCREMENT = 100 ; --(设置自增ID从100开始) -
mysql主键自增和uuid的区别?
2020-12-17 18:15:28自增主键:新增数据时,位置相对固定(B+树中的右下角)增加数据插入效率,减少插入的磁盘IO消耗,每页的空间在填满的情况下再去申请下一个空间,底层物理连续性更好. UUID:由于UUID是随机生成的 插入时位置具有一定... -
MySQL自增主键删除后重复问题
2020-12-15 00:40:54设置一张MySQL表,表里有一个自增主键ID,往表里插入数据,假如插入数据之后表后一行的ID是100,我先删除这条ID为100的记录,然后重新启动服务器,按理说如果再往这个表里插入新的记录,新纪录的ID将为101,对吧... -
Mysql 主键自增插入数据问题
2021-01-18 18:57:40MySQL数据库表中有自增主键ID,当用SQL插入语句中插入语句带有ID列值记录的时候;如果指定了该列的值,则新插入的值不能和已有的值重复,而且必须大于其中最大的一个值;也可以不指定该列的值,只将其他列的值插入,... -
mysql主键自增和UUID的区别
2020-06-29 23:35:211、自增主键 在进行数据库插入时,位置相对固定(B+树中的右下角)增加数据插入效率,减少插入的磁盘IO消耗,每页的空间在填满的情况下再去申请下一个空间,底层物理连续性更好,能更好的支持区间查找 2、UUID 由于... -
mysql 主键自增 但是报主键重复的异常问题探究- Duplicate entry
2020-12-23 02:34:571、mysql数据库设置数据库主键自增的规律·第一,在主键字段上增加AUTO_INCREMENT`id`int(8)NOTNULLAUTO_INCREMENTCOMMENT'主键',·第二,默认表的第一条数据是从1开始计数的,但是在建表语句中是可以修改这个起始值... -
MySQL 主键 自增 ID 会用完吗?
2019-09-21 12:02:01MySQL 主键 自增 ID 会用完吗? 首先我们一般创建 MySQL 数据表的时候,大部分情况下会创建一个自增主键ID 的字段,可能你的建表语句如下: CREATE TABLE IF NOT EXISTS `tb`( `id` INT UNSIGNED AUTO_INCREMENT, ... -
如何让MySQL主键自增从1开始,或者从固定值开始
2020-12-04 11:27:08如何让MySQL主键自增从1开始,或者从固定值开始 ALTER TABLE 表名 AUTO_INCREMENT=1; 1为你主键id自增起始值 -
mysql 主键自增 从任意的数字开始
2020-09-26 14:36:11alter table table_name auto_increment = 111111 -
MySQL 主键自增,会出现跳键
2019-01-24 11:16:43MySQL 主键自增,会出现跳键 这个表记录的是设备的心跳数据,记录设备第一次上传心跳的时间和最后一次上传数据的时间 我的sql: insert into tb_ap_heart (ap_id, create_time, update_time) values (#{apId,... -
深入探寻mysql自增列导致主键重复问题的原因
2020-09-10 12:57:18前几天开发的同事反馈一个利用load data infile命令导入数据主键冲突的问题,分析后确定这个问题可能是mysql的一个bug,这里提出来给大家分享下。以免以后有童鞋遇到类似问题百思不得其解,难以入眠,哈哈。 -
MyBatis中MySQL主键自增返回
2018-09-05 11:05:191.MySQL主键自增返回 查询id的sql SELECT LAST_INSERT_ID() 通过修改User.xml映射文件,可以将mysql自增主键返回: 如下添加selectKey 标签 <!-- 保存用户 --> <insert id="save... -
MySQL主键自增时SQL写法/当前时间写法
2019-04-15 14:51:00MySQL主键自增是SQL写法 有表table,列id,name ,email (id为自增主键) INSERT INTO table1 (name,email) VALUES ('abc','123@qq.com') INSERT INTO table1 (id, name,email) VALUES (null,’liu’,’123@163... -
mysql主键自增从1开始
2018-03-07 14:41:22truncate 表名; 注:会清空数据!!!!!切记!!!! -
mysql主键自增为什么比随机和自定义快?
2019-03-04 09:46:512、如果使用非自增主键(如果身份证号或学号等),由于每次插入主键的值近似于随机,因此每次新纪录都要被插到现有索引页得中间某个位置,此时MySQL不得不为了将新记录插到合适位置而移动数据,甚至目标页面可能已经... -
mysql表主键自增,高并发插入情况下会不会主键重复?mysql Innodb引擎主键自增是什么原理?
2021-02-03 01:31:27虽然我们习惯于给主键ID指定AUTO_INCREMENT属性,但是AUTO_INCREMENT也是可以指定到...MySql 5.1之前的实现在这个版本之前,用AUTO_INCREMENT修饰的数据列确实是严格连续自增的。MySql的实现是会针对每个插入语句加... -
Gorm mysql主键自增但go语言返回的全是0
2021-12-16 00:28:36Gorm mysql主键自增但go语言返回的全是0 虽然MySQL字段名不区分大小写,但查询主键时改为和数据库一样的小写时就成功了。 -
mysql自增id超大问题的排查与解决
2020-12-15 22:48:30小A正在balabala写代码呢,DBA小B突然发来了一条消息,“快看看你的用户特定信息表T,里面的主键,也就是自增id,都到16亿了,这才多久,在这样下去过不了多久主键就要超出范围了,插入就会失败,balabala……” ... -
mysql自增ID起始值修改方法
2020-09-10 18:01:17本文介绍mysql自增ID的起始值修改与设置方法 -
mysql设置主键自增
2021-11-04 14:52:411.mysql数据库给主键增加一个自增的功能: mysql> alter table sec_user modify id integer auto_increment ; Query OK, 1 row affected (0.28 sec) Records: 1 Duplicates: 0 Warnings: 0 2.java程序添加... -
关于MySQL主键自增获取到为null值得问题
2018-06-26 23:57:08在学习springBoot做项目的时候遇到了数据库表字段明明是自增但是取到的结果却是null的问题。情况如下:没有正确取到id,而是为null解决办法:在“insert”后中添加如下字段<insert id="insert" ... -
mysql 设置主键自增语句
2021-07-07 09:48:43mysql 设置主键自增语句 alter table 表名 modify id int auto_increment primary key 若提示 > 1068 - Multiple primary key defined 说明已经设置过主键了,去掉语句后面的 primary key即可。 -
mysql设置非主键自增
2021-02-02 04:02:23@GeneratedValue(strategy = GenerationType.IDENTITY) 根据底层数据库自动选择方式,需要底层数据库的设置 如 MySQL,会使用自增字段,需要将主键设置成 auto_increment......(8,2) 中文含义 存款流水号 客户标识 银行... -
Mysql关于主键自增后的插入语句编写
2022-03-14 17:11:18如果设置了id主键自增的话,编写插入语句不需要插入id值 那么mysql的语句就变为: insert into table_name (字段名,字段名) value(插入值,插入值);