首页
学习
活动
专区
圈层
工具
发布

MySQL 自增主键,你以为很简单?这6个坑90%的开发者都踩过!

row in set (0.01 sec) 如图: 1.2 三种插入模式(innodb_autoinc_lock_mode) 该参数控制并发插入时的锁行为,默认值为 1(交错模式): mysql> show...在MySQL5.7版本中,数据库重启后自增id的值会根据表里的数据id的最大值+1获取,如果重启前,原先表里的最后几个id(比最终id大的id被删除或回滚的事务用到的id)会重复分配,不过MySQL8.0...中已修复此问题,因为两个版本的id恢复方式不一样: MySQL 5.7:重启后执行 SELECT MAX(id) + 1 重建计数器。...中可以插入时分配的值是正常的。...| ttt | +------+------+ 6 rows in set (0.00 sec) 原因:这是设计行为,AUTO_INCREMENT 计数器始终为 MAX(当前最大ID, 显式插入值

80010

【Mysql】:linux环境下表的三部曲(数据操作 + 类型解析 + 约束规则)

是提示的 21844 utf8 MySQL的 utf8 不是真正的 UTF-8 编码 在 utf8 编码中,varchar(n) 的参数n最大值为 21844 MySQL在存储字符类型的时候,认为 utf8...总结:varchar 类型 根据实际字符个数动态分配空间,最大字节数 为65535,但需要预留 1-3 个字节用于记录实际字符长度。...所以我们上面说的是 21844 证明: 实际我们算出来是21844,这里是21845主要原因是因为它也到那三个字节计数数据的也带上来了。...,不插这一类就给 默认值 null 【数据插入】测试: mysql> insert into myclass values('1班'); ERROR 1136 (21S01): Column count...) **注意:**我们对具体某列进行插入时,需要声明该列名字来进行匹配,否则不然就会上面第一行的错误 某列设置了 not null 必须要插具体值,不插因为后面没有默认值就报错,而且插入null也报错

1.2K00
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    mongodb与MySQL的不同_Mongodb与MySQL之间的比较分析

    2、MongoDB在指定_id与不指定_id插入时速度相差很大,而MySQL的差别却小很多。...分析: 1、在指定_id或主键时,两种数据库在插入时要对索引值进行处理,并查找数据库中是否存在相同的键值,这会减慢插入的速率。...而在指定_id插入时,MongoDB每插一条数据,都需要检查此_id可不可用,当数据库中数据条数太多的时候,这一步的查询开销会拖慢整个数据库的插入速度。...: 总结: 1、整体上的插入速度还是和上一回的统计数据类似:MongoDB不指定_id插入 > MySQL不指定主键插入 > MySQL指定主键插入 > MongoDB指定_id插入。...分析: 1、如果MySQL没有经过查询优化的话,其查询速度就不要跟MongoDB比了。

    00

    技术分享 | 关于 MySQL 自增 ID 的事儿

    当我们使用 MySQL 进行数据存储时,一般会为一张表设置一个自增主键,当有数据行插入时,该主键字段则会根据步长与偏移量增长(默认每次+1)。...自增的值并不是保存在表结构信息内的,对于不同的版本它们有如下的区别: 1.1.1 MySQL 8.0版本之前(重启后可能会产生变化): 计数器的值存储在内存中的,重启后丢弃,下一次将读取最大的一个自增ID...1.1.2 MySQL 8.0版本(重启后保持不变): 计数器的值将会持久化到磁盘。...,不是事务结束 连续模式:批量插入时锁持有到该语句执行结束,简单插入时锁持有到申请完自增ID后即释放,并非直到语句完成 1.4 计数器的三种模式(innodb_autoinc_lock_mode) 通过调整...不一定,业务也不应该过分依赖 MySQL 自增 ID 的连续性,在以下三种情况下,并不能保证自增 ID 的连续性: 1.5.1 插入时的其他唯一索引冲突 假设已存在数据{1,张三},且张三所属的字段设置了唯一主键

    5.3K10

    mysql类型int长度是11,最多可以有多少条数据?如果超过超过设计值会怎么样?

    我想了有两个问题1.最多能存多少数据2.如果id的自增超过设计值,会出现什么问题?所谓“超过设计值”,就是当 AUTO_INCREMENT 达到或超过上表的最大值时。...会自动维护一个内部的自增计数器。...每次插入新行时,id 会自动加 1,直到到达类型能表示的最大值。二、当达到上限时,会发生什么?假设字段是:类型定义最大值到达上限时会怎样?...INT(默认有符号)2,147,483,647插入时报错INT UNSIGNED4,294,967,295插入时报错BIGINT UNSIGNED18,446,744,073,709,551,615理论上几乎到不了...手动重置自增计数器(不推荐长期用)如果部分数据已删除,且希望复用低 ID,可以:ALTER TABLE users AUTO_INCREMENT = 1000;⚠️ 但仅当你确保没有主键冲突时才可以安全执行

    1.1K10

    MySQL自增ID,居然大部分人都搞错了!?

    知识点一:delete数据后,自增列计数不会从头开始。 画外音:truncate数据后,自增列计数会从头开始。...知识点二:含自增列的表,插入时可以手动指定自增列的值,但不能与已有值冲突,也可以使用系统默认自增列的值。...因此,第五、六、七步都是允许的: insert (0, '000') insert (1, '111') insert ('222') 知识点三:如果手动指定自增列的值是0或者NULL,MySQL会视为无效...'000') 第六步 insert (1, '111')没有问题 实际插入的也是 (1, '111') 知识点四:如果使用系统默认自增列的值,会从当前最大值开始往后增加。...答案: (1, 'shenjian') (111, '111')    // 允许指定值 (112, 'abc')    // 忽略NULL,从最大值开始增 (222, '222')    // 允许指定值

    1.2K20

    【初阶数据结构篇】插入、希尔、选择、堆排序介绍(上篇)

    插入、希尔、选择、堆排序 前言 本篇以排升序为例 代码位置 gitee 排序方法 常见排序算法 本篇介绍前四种,在之后博客中会讲到交换排序和归并排序以及计数排序 插入排序 直接插入排序 基本思想...array[i-1],array[i-2],… 的排序码顺序进⾏⽐较,找到插⼊位置即将 array[i] 插⼊,原来位置上的元素顺序后移 以排序数组为例: int a[] = { 5, 3, 9, 6...{ break; } } arr[end + 1] = tmp; } } 时间复杂度分析: 最坏情况:数组降序排列 当我们对下标为i(0入时...,会将其与前面i个数据比较i次,总比较次数即1+2+3+……(n-1),为O(n2) 最好情况:数组升序排列 当我们对下标为i(0入时,只会与其前面一个数据比较一次,...,再将数组分成各组,进⾏插⼊排序,当gap=1时,就相当于直接插⼊排序。

    54010

    开源 | 慧知汽车充电桩平台V2.5.2.3-企业级代码包含多租户、硬件模拟器、多运营商、多小程序 云快充1.5 云快充1.6、SpringCloud、MySQL、uniapp、redis ;

    后台体验账号 1.小程序体验账号 2.PC后台体验账号 三、产品简介?...初心:做了很多产品项目都商业落地了但是仅仅服务商业本身无法释放产品的价值,不在重复造轮子,让更多的企业和个人能够减少投入 3.业务架构图 四、核心功能以及核心技术栈 1.| 全面拥抱微服务| 全面拥抱引入时序数据库...发票:自动分账 6.即插即充 7.v2g反向充电 8.支持多种协议:公牛、中某联、睿某薇、帝X、等等几十种协议。 9.预约充电 10.占位订单 11.支持高并发百万级设备采用队列+netty方案。...初心:做了很多产品项目都商业落地了但是仅仅服务商业本身无法释放产品的价值,不在重复造轮子,让更多的企业和个人能够减少投入 3.业务架构图 四、核心功能以及核心技术栈 1.| 全面拥抱微服务| 全面拥抱引入时序数据库...发票:自动分账 6.即插即充 7.v2g反向充电 8.支持多种协议:公牛、中某联、睿某薇、帝X、等等几十种协议。 9.预约充电 10.占位订单 11.支持高并发百万级设备采用队列+netty方案。

    22910

    mysql 主键自增语句_MySQL 自增主键

    这主要跟自增主键最大值的获取方式,以及存放位置有关系。 如果最大值是通过计算获取的,并且在某些情况下需要重新获取时,会因为最新的数据被删除而减小。 自增主键最大值怎么取的?存放到哪里?...MySQL 5.7 及之前的版本,自增主键最大值会在启动(重启)后从数据库中取出放到内存: SELECT MAX(ai_col) FROM table_name FOR UPDATE; 这样获取是通过计算的...从 MySQL 8.0 开始,自增主键最大值会在每次修改后写入到 redo log,并且在每个检查点写入引擎私有的系统表。 如果是正常重启,则读取系统表里的值。...保证事务 A 的数据的 ID 连续: innodb_autoinc_lock_mode = 1 (AUTO-INC Locking) 和上面的区别在于,当执行 确定数量 的批量插入时,使用轻量级互斥量(...mutex)而不是特殊表锁(AUTO-INC Locking),从而提前向内存的计数器申请相应数量的 ID。

    00

    MySQL学习笔记(长期更新)

    约束类型: 默认约束:插入时如果没有指定值,则插入默认值 主键约束:保证数据的唯一性 外键约束:预防破坏表之间连接的行为 非空约束 :字段值不能为空 唯一性约束:字段值不能重复 自增约束:字段在插入时自动...插入:插⼊⼀条部分字段数据记录是可以的,但前提是,没有赋值的字段,⼀定要让MySQL知 道如何处理,⽐如可以为空、有默认值,或者是⾃增约束字段,等等,否则,MySQL会提⽰错误的。...插入查询结果,MySQL⽀持把查询的结果插⼊到数据表中,我们可以指定字段,甚⾄是数值,插⼊到数据表中。...branchnumber = 11 AND cashiernumber = 1 AND itemnumber = 100,包含了从左到右所有字段,所以可以最大限度使用索引。...张三在⻔店消费结算的时候,开启了⼀个事务A,包括这样3个操作: 1. 读取卡内⾦额为100; 2. 更新卡内⾦额为0; 3. 插⼊⼀条销售流⽔。

    1.8K10

    数据库圣经--约束

    student; 2、default默认值约束 注意:插入时只指定了 Id,这时 name 列使用默认值填充当为某列设置了默认约束的时候,如果不给这个列指定值才会使用默认约束 虽然指定了默认约束,但当我们手动指定这一列的值为...例如在 MySQL 中,若将主键列 id 设为 auto_increment,每次插入新数据,id 会自动从当前最大值加 1,这有助于高效地生成唯一标识,保障数据的唯一性和完整性,常与主键约束配合使用。...数据 insert into student(id, name) values (1, '张三'); # 重复插⼊主键冲突,此时主键值由id和name两个列共同决定 这个定义方法是错误的 drop...MySQL 中的特殊情况:MySQL 会对 CHECK 子句进行语法分析,但实际会忽略该约束,即 MySQL 不强制执行 CHECK 约束,若需实现类似逻辑,需通过触发器等方式实现。...版本差异:MySQL 8.0 中 CHECK 约束有效,会强制执行数据校验;MySQL 5.7 中 CHECK 约束不生效,需在代码层面(如应用程序逻辑)做数据有效性校验。

    52410

    MySQL批量插入数据,一次插入多少行数据效率最高?

    mysql默认的sql语句的最大限制是1M(mysql5.7的客户端默认是16M,服务端默认是4M),可以根据设置查看。...3、计算一次能插入的最大行记录 1M计算的话,(1024*1024)/52 ≈ 20165 ,为了防止溢出,最大可一次性插入20000条(根据自己的配置和sql语句大小计算)。...后面通过各种百度,博主觉得最大只是代表传输数据包的最大长度,但性能是不是最佳就要从各个方面来分析了。...当写密集的情况下,插入缓冲会占用过多的缓冲池内存,默认最大可以占用到1/2的缓冲池内存,当插入缓冲占用太多缓冲池内存的情况下,会影响到其他的操作。...当一张表中存在非聚簇的且不唯一的索引时,在插入时,数据页的存放还是按照主键进行顺序存放, 但是对于非聚簇索引叶节点的插入不再是顺序的了,这时就需要离散的访问非聚簇索引页,由于随机读取的存在导致插入操作性能下降

    10.7K30

    MySQL 批量操作,一次插入多少行数据效率最高?

    mysql默认的sql语句的最大限制是1M(mysql5.7的客户端默认是16M,服务端默认是4M),可以根据设置查看。...3、计算一次能插入的最大行记录 1M计算的话,(1024*1024)/52 ≈ 20165 ,为了防止溢出,最大可一次性插入20000条(根据自己的配置和sql语句大小计算)。...------+ | 110000 | +---------------+ 有个博客说一次插入10条最快,,我觉得一次插的有点少,咱们试试 这个博主测试后,认为一次插10条是性能最快的,他的每条记录是...当写密集的情况下,插入缓冲会占用过多的缓冲池内存,默认最大可以占用到1/2的缓冲池内存,当插入缓冲占用太多缓冲池内存的情况下,会影响到其他的操作。...当一张表中存在非聚簇的且不唯一的索引时,在插入时,数据页的存放还是按照主键进行顺序存放,但是对于非聚簇索引叶节点的插入不再是顺序的了,这时就需要离散的访问非聚簇索引页,由于随机读取的存在导致插入操作性能下降

    2.8K30

    大型数据集的MySQL优化

    虽然很难保持MySQL数据库高速运行,但面对数据堆积,可以通过一些性能调整,来使其继续工作。本文则将围绕这一问题展开讨论。 导论 设计数据库之前,有必要先了解一下表的使用方法。...不止如此,通过SSD(闪存盘)存储设备,压缩的益处会达到最大化,原因是其容量小于传统HDD(旋转硬盘驱动)设备。 按主键顺序批量导入数据 进行批量插入时,按照主键顺序插入行,速度会更快。...硬件优化 很久之后才能开始变更MySQL的设置,但如果在次优硬件上操作,则不会造成什么影响。 内存 写入时采用16到32GB的RAM应当是效果最佳的。...如上所述,在某些情况下,可以使用SSD(特别当需要执行多项写入时)。假设驱动器转速为7200 RPM,则IPOS(每秒输入输出操作)不可能超过100,而SSD的速度则至少是它的五倍。...此外,还有许多本文未曾涉及的方法,可以用来优化MySQL服务器。例如,MySQL包含许多服务器变量,它们都可以进一步优化,且在不久的将来,这些发展就会实现。

    1.8K60

    【数据结构】单链表(Singly Linked List ) && 静态链表(Static list)

    当有节点插入时,系统动态的为结点分配空间。在结点删除时,应该及时释放相应的存储单元,以防止内存泄露。由于是链式存储,所以操作单链表时,必须知道头结点或者头指针的位置。...一开始设置一个计数变量,不断遍历链表,让计数器自增。找到合适的位置将数据读取出来。...指定位置前插 == 指定位置的前一个位置进行后插。懂了吧?...iCount == index) { Node * p = new Node; q = phead; phead = phead->pnext; //后插就是后一个节点的前插咯...//---------线性表的静态单链表存储结构-------- #define MAXSIZE 1000 /*假设链表最大长度为1000*/ typedef struct { datatype

    2.5K10

    MySQL中都有哪些锁?

    这也就产生一个问题,当数据库重启后,第一次打开表时,MySQL会找到这个表中自增列的当前最大值maxId,然后将maxId + 1作为这个表的自增值。但是这个自增值不一定和重启之前值一样。...举例来说,假设在重启之前,将这个表中自增列为25的最大一条记录删除了,当我们进行插入时,自增的值并不会回退到25,而是使用26。...其实在 MySQL InnoDB 存储引擎的内存结构里面,对于每张包含自增列的表,都维护了一个自增长计数器(auto-increment counter),每当进行插入时,就会对这个计数器进行+1操作,...在对计数器进行+1操作前加上,这样就保证了并发自增的安全性,不会出现重复现象。为了提供插入的性能,自增锁并不会等到事务结束才会释放,而是在插入完成之后就立即释放了。...1:MySQL 7 及之前的默认值,对于普通insert操作,采用更加轻量级的互斥量(mutex)来实现计数器的自增。

    2.8K51

    4.表记录的更新操作

    表记录的插⼊ 批量插⼊多条记录 例如: insert…select插⼊结果集 注意:字段列表1与字段列表2的字段个数必须相同,且对应字段的数据类型尽量保持⼀致。...例如: 使⽤replace插⼊新记录 insert into表名[(字段列表)] values(值列表) insert into表名[(字段列表)] values (值列表1), (值列表2),...where条件表达式 replace [into]表名 set字段1=值1,字段2=值2 MySQL中的特殊字符序列 转义后的字符 \" 双引号“ \' 单引号‘ \\ 反斜线\ \n 换⾏符...如果使⽤truncate table成 功清空表记录,那么会重新设置⾃增型字段的计数器。truncate table语句不⽀持事务的回滚,并且不 会触发触发器程序的运⾏。...MySQL特殊字符序列 update表名 set字段名1=值1,字段名2=值2,…,字段名n=值n [where条件表达式] delete from表名[where条件表达式] truncate

    1.9K30

    数据库基础

    范式在设计数据库表时,通常需要遵循一些规范,也就是范式。范式主要分为第⼀范式、第⼆范式、第三范式、巴斯-科德范式(BCNF)、第四范式和第五范式,范式级别越⾼对数据表的要求越严格。...加锁顺序不⼀致导致的死锁想象这种情况:事务1持有资源1的锁,事务2持有资源2的锁,事务1申请资源2的锁发⽣等待,这时如果事务2申请资源1的锁,就会出现死锁。...插⼊意向锁和间隙锁发⽣死锁假设现在有表 t,只存在 id 为 1和2的记录,当两个事务同时插入不同记录时,场景如下: 注意当对未存在的⾏进⾏加锁的时候,mysql是会锁住⼀段范围,即间隙锁。...⾏锁与间隙锁发⽣死锁假设现在有表 t,主键id最大值是5,模拟场景如下:死锁避免方法要避免死锁,最直接的⽅法就是破坏产⽣死锁的条件,如互斥条件、循环等待等。...这种索引⼀般⽤来保证数据的唯⼀性,⽐如保存账户信息的表,每个账户的id必须保证唯⼀,如果重复插⼊相同的账户id时会MySQL返回异常。 主键索引 :是⼀种特殊的唯⼀索引,但是它不允许出现空值。

    84210
    领券