MySQL的auto_increment使用

2023-11-18

说明

总结自《mysql技术内幕(第5版)》

创建auto_increment列要遵循如下规则

  1. 每个表只能有一个列具有auto_increment属性,且必须为整数数据类型
    (当然,也支持浮点类型,但强烈不建议)
  2. 该列必须建立索引,最常见的就是使用primary key或unique索引,当然,也支持不唯一索引
  3. 该列必须是not null的

auto_increment列将有如下特性

  1. 用insert插入auto_increment列
    1. 该值已存在,且该列是unique,发生键重复错误
    2. 插入成功,若该值大于auto_increment,则重置auto_increment
    3. 若该值为null,该值被置为当前序号,并引发MySQL自动生成下一个序号
    4. 若该值为0,且未启用no_auto_value_on_zero模式,等效于该值为null的情况
    5. 若该值为0,且已启用no_auto_value_on_zero模式,插入成功
  2. 用update更新auto_increment列的值
    1. 若新值已使用且该列是unique的,则发生键重复错误
    2. 若新值大于已有值,重置auto_increment
    3. 若新值是0,且未存在,插入成功(即使未启用no_auto_value_on_zero模式)
  3. 用replace更新行
    1. 若根据auto_increment列的值来更新,则auto_increment列值不变
    2. 若根据其他具有唯一性的列的值来更新,且序号列值为null或0且未启用no_auto_value_on_zero时,该列的值被更新为新序号
  4. auto_increment开始序号默认值为1,每次递增量默认值为1

获取当前会话最近生成的auto_increment值

使用last_insert_id()方法

  1. 返回最近生成的auto_increment值,若从未生成过,返回0
  2. 一次插入多行的insert语句,只返回语句中第一次生成的auto_increment值
  3. 如果使用insert delayed,那么直到实际插入行时,才会生成auto_increment值,这时该方法无用

不同存储引擎对auto_increment列的支持

1. InnoDB

  1. 在创建表时,可以使用auto_increment = n表选项来设置初始序列值
    并且在表创建之后,还可以使用alter table tb_name auto_increment = m来进行修改
  2. 如果生成auto_increment值的事务被回滚,那么auto_increment将不会回滚,即出现序列断层
  3. 从序列顶端(序列值趋向大的为顶端)删除的值通常不能再重用。不过如下情况可以:
    1. 使用truncate table tb_name清空表,表数据将被清,且auto_increment将重置为1
    2. 在首次生成auto_increment值时,InnoDB会使用列的当前最大值+1(若表为空,则值为1)
    3. InnoDB将在内存中维护auto_increment值,即auto_increment值不在表空间里,当删除序列顶端某些值时,再重启服务器,则之前被删除的序列顶端的值将被重用。
  4. 重启服务器,在create table或alter table语句里使用的auto_increment选项将失效
  5. 表里不能使用符合索引生成多个独立的序列

2. MyISAM

  1. 序列一般是单调的,且被删除后不会被重用,以下情况除外:
    1. 使用truncate table tb_name清空表数据,auto_increment=1
    2. 表里使用复合索引生成序列,则从序列顶端被删除的值将被重用
  2. 序列默认从1开始,可以在create table语句里,使用auto_increment = n来指定
  3. 可以使用alter table auto_increment = m来修改

重置已有列的序列编号

使用一个alter table语句,删除auto_increment列,再加回来,且设置auto_increment=1

//已有表
create table tb_name(
`name` char(10),
id int unsigned not null auto_increment primary key
);
//重置序列号,此列若被别处引用可能失败或破坏两表间的关系
alter table tb_name
drop primary key,
drop id,
add id int unsigned not null aut
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL的auto_increment使用 的相关文章

  • 如何在不超时的情况下解析大型 CSV 文件?

    我正在尝试解析 50 MB 的 csv 文件 文件本身很好 但我正在尝试解决所涉及的大量超时问题 每个设置上传明智 我可以轻松上传并重新打开文件 但浏览器超时后 我收到 500 内部错误 我的猜测是我可以将文件保存到服务器上 打开它并保留我
  • Mysql - Mysql2::错误:字符串值不正确:

    所以我建造了一个刮刀并拉动一些物体 问题是有些是外语 它使 mysql 数据库有点崩溃 这是我得到的错误 知道我能用这个做什么吗 谢谢 Mysql2 错误 列的字符串值不正确 xC5 x8Dga 第 1 行的 描述 插入sammiches
  • 使用mysql在一个查询中选择多个表中的子项总数

    我整个下午都在尝试处理一个查询 或两个或三个 以获得三个表的所有子表的计数 看看我的设计 用户表 id user name 1 foo 2 bar 赢表 id won user 1 1 2 1 3 2 绘制表格 id draw user 1
  • MySQL SELECT 输出同一行中每个 id 的下一个日期

    我查询的表结构如下 ID Date Before value After value 1 2014 04 25 Win Loss 1 2014 04 30 Loss Win 1 2014 08 18 Win Loss 1 2014 08 2
  • MySQL Workbench 6.0 错误无法获取管理员的管理访问权限?

    我在这里使用 MySQL Workbench 6 0 当我选择服务器状态时 出现此错误 对此 我尝试在Google和StackOverflow上寻找解决方案 e g 这个结果 https stackoverflow com question
  • MySQL InnoDB 查询性能

    我正在尝试优化一个简单的 sql 查询 该查询将多次运行大量数据 这是场景 MySQL 与 InnoDB 表 where 和 join 中使用的所有字段都已索引 表有 FK 我不需要查询的整个缓存 但每个表的缓存是可能的 表有更多的更新 插
  • mysql语句中的*星号是什么意思?

    Ex mysql query SELECT FROM members WHERE id id 这意味着选择表中的所有列
  • PHP PDO相关:更新SQL语句未更新数据库内容

    我正在尝试使用准备好的语句来实现更新语句PHP http en wikipedia org wiki PHP脚本 但它似乎没有更新数据库中的记录 我不确定为什么 所以如果您能分享一些见解 我将不胜感激 Code query UPDATE D
  • 如何将 MySQL 数据库更改为 UTC?

    我使用的是 Windows 7 对数据库方面的东西有点陌生 我尝试在 Google 上搜索如何将系统时区更改为 UTC 但文档有些高级 我不太确定如何更改此字段 在 my ini 文件的 mysqld 部分下 添加以下行 default t
  • 将记录分成两列

    我的数据库中有一个 学生 表 其中包含大约 5 000 条记录 我想将这些记录显示在two分区 如何在不执行查询两次的情况下做到这一点 仅使用单个查询 显示示例http www freeimagehosting net uploads f1
  • 使 pdo::query 静态

    当我运行下面的代码时出现此错误 我通常使用 msql 函数 但我尝试使用 PDO 代替 怎么了 致命错误 第 14 行无法静态调用非静态方法 PDO query
  • 无法启动 MySQL 服务器 - 控制进程退出并出现错误代码

    我的 mysql 服务器停止后无法启动 命令使用 sudo etc init d mysql restart Error 重新启动 mysql 通过 systemctl mysql serviceJob for mysql service
  • Hibernate 对集合的查询过滤器

    我想执行以下查询 from Item i where i categoryItems catalogId catId 然而 这会产生以下异常 非法尝试取消引用集合 所以我用谷歌搜索 找到了这个 Hibernate 论坛帖子https for
  • 为什么这会返回资源 id #2? [复制]

    这个问题在这里已经有答案了 可能的重复 我如何从 PHP 中的 MySql 响应中 回显 资源 id 6 https stackoverflow com questions 4290108 how do i echo a resource
  • MySQL Connector/C++ 库链接错误问题

    PROBLEM 好吧 我一直在尝试遵循 MySQL Forge Wiki 和其他一些网站上的示例代码 这些网站提供了有关如何获得简单数据库连接的教程 但由于某种原因 我的项目总是因链接错误而失败 我可以我自己不明白为什么或如何解决它 我仍在
  • MYSQL 区分大小写的 utf8 搜索(使用 hibernate)

    我的登录表具有 utf8 字符集和 utf8 排序规则 当我想要检查用户名并检索该特定用户名的其他信息时 hql 查询会为我提供小写和大写相同的结果 我应该如何处理适用于案例的 HQL 查询 我使用 Mysql 5 和 java hiber
  • InnoDB 因读未提交而死锁! - Java - Glassfish - EJB3(JPA/Hibernate)

    几天来 我在使用 Glassfish EJB3 和 Mysql InnoDB 的 Java 应用程序上遇到了死锁问题 配置 Mysql InnoDB Ver 14 12 Distrib 5 0 51a 适用于 debian linux gn
  • 使用 PHP 的 MySQL 连接字符串

    我正在尝试通过本地计算机连接到托管在我的服务器上的数据库 我的服务器有cPanel 11 它是一个典型的共享服务器 由CentOS提供支持 安装了PHP和MySQL 准确地说 我在同一台服务器上持有经销商帐户 我想在不同帐户或域之间访问数据
  • Apache、PHP 和 MySQL 可移植吗?

    我可以在外部硬盘上运行 Apache PHP 和 MySQL 吗 我需要这个 因为我在不同的地方工作 计算机 有时我没有安装和配置所有使用的应用程序 当然可以 XAMPP http www apachefriends org en xamp
  • 在 MySQL 中使用 COUNT 时如何返回 0 而不是 null

    我使用此查询返回存储在 sTable 中的歌曲列表以及存储在 sTable2 中的总项目数 SQL queries Get data to display sQuery SELECT SQL CALC FOUND ROWS str repl

随机推荐

  • rz: xxxxxxx removed

    今天使用的好好的 突然不能使用rz上传文件了 并且报了一个错误 后面尝试使用命令rz be替换rz上传以后文件正常上传了 关键时刻还是很耽误时间的
  • 国内DNS首选

    配置最快的DNS 为了提高网页的访问打开速度我们可以配置一些解析速度较快的dns 下面作者搜集了一些常用的DNS地址 可以根据自己所在地区可以选择不同的dns 首先可以在我们的客户端打开终端命令行工具测试一些 去ping 一下下面的这些dn
  • java图片上传服务器返回访问地址

    application xml 单个数据的大小 multipart maxFileSize 10Mb 总数据的大小 multipart maxRequestSize 10Mb 文件上传目录 window是d e f盘 linux是 注意Li
  • Ubuntu 64位编译32位程序

    title Ubuntu 64位编译32位程序 背景 一般情况下 一个平台上只能编译当前平台对应的应用程序 比如 64位平台编译64位应用程序 但是随着64位平台的普及 多数采用了64位操作系统 而有时又基于某些原因需要编译出32位的应用程
  • 数学公式公式获取工具 Mathpix snipping Tool

    先上下载地址 链接 https pan baidu com s 1Ac9 f9vdeuLGD hUburYgg 提取码 6e3z 使用 ctrl alt m 截取公式 如图 复制LaTeX 然后要用上Typora 下载地址 Typora 下
  • Android开发中遇到mBluetoothAdapter.startDiscovery()搜索不到任何蓝牙设备

    最近在更新开发公司的APP应用程序 版本已经都开发完成了 准备做发布的时候 突然我们的一个程序员反馈 在他的手机上测试 APP程序无法搜索到任何的蓝牙设备 于是我就懵逼了 因为APP程序已经在Android 6 0 9 0的几台真机上都测试
  • 冒泡排序(Bubble Sort)(代码+动画)

    重复地走访过要排序的数列 一次比较两个元素 如果它们的顺序错误就把它们交换过来 1 1 算法描述 比较相邻的元素 如果第一个比第二个大 就交换它们两个 每次排完 最后的元素应该会是最大的数 总共比较数组长度 1次 1 2 动画演示 1 3代
  • VSCode Docker linux环境开发 for Windows 10

    本文利用vscode Remote Containers插件与Docker在windos平台实现linux环境开发 Docker 1 下载 Docker Desktop Docker Desktop for Windows 2 安装Dock
  • 机器人传感器网络的覆盖优化和空间负载均衡

    qquad 文中主要研究具有区域约束的机器人网络执行静态最优覆盖 给定密度函数描述事件发生的概率 执行函数 p e r f o r
  • maven 打包时动态替换properties,xml资源文件中的配置值

    pom build节点下面添加resource配置 html view plain copy
  • Qt GlobalColor 颜色、及其显示

    Qt Namespace The Qt namespace contains miscellaneous identifiers used throughout the Qt library More Header include
  • Matlab下地形图绘图包m_map绘图包绘制高分辨率海岸线、国界线与河流

    1 前言 之前说了m map的下载 安装与基本使用 Matlab下地形图绘图包m map安装与使用 以及晕渲地形图的绘制 m map绘制晕渲 shaded relief 地形图 现在再说一下高分辨率海岸线 国界线与河流的绘制 2 安装 高分
  • ubuntu软件更新源,更改,可提高更新的速度,移动端app开发

    6 安装系统更新 打开 系统 gt 系统管理 gt 更新管理器 安装更新 完成后若系统提示重新启动 请重新启动系统 如果你是校园网用户 请查看 Ubuntu11 04教育网源 下面是Ubuntu 11 04一些常见的源 Ubuntu官方源
  • 毕业设计 stm32人脸识别系统 - 单片机 物联网 嵌入式 机器视觉

    文章目录 0 前言 1 简介 2 主要器件 3 实现效果 4 设计原理 K210实现人脸识别 5 部分核心代码 6 最后 0 前言 这两年开始毕业设计和毕业答辩的要求和难度不断提升 传统的毕设题目缺少创新和亮点 往往达不到毕业答辩的要求 这
  • docker清理磁盘占用

    我的个人博客 逐步前行STEP 1 docker system df 查看docker磁盘占用 2 docker system prune Docker 的 docker system prune 命令可以删除那些已停止的容器 dangli
  • 关于uart串口接收端乱码问题

    问题 在给gd32f303单片机封装串口驱动时 发现接收端乱码 解决 经排查发现是系统时钟不准 经过调整内部时钟后成功解决问题 注 异步通信协议uart依赖双方时钟的准确 任一方时钟不准都会导致乱码问题 其他导致串口出问题的原因 1 分开的
  • Java毕设项目二手交易市场整站源码 校园转转二手市场源码

    本篇为大家带来的是Java开源项目 校园二手交易平台 可以用来做实战演练 也可以用来做毕业设计 校园转转二手市场源码分享 Java写的应用 改成本毕设啥还是挺不错的 mybatis plus 和 Hibernate随心用 基于 Java 开
  • Android 更新UI方法的深度解析

    1 Handler public class SecondActivity extends Activity private static final int MSG WHAT 101 TextView tv Button btn priv
  • Unity 制作动画 - Animation 的使用

    1 unity 顶部导航栏点击 Window gt Animation 打开 Animation 窗口 通过这个窗口可以创建 编辑动画 也可以查看导入的动画 Animation 窗口同一时间只能查看 编辑同一段Clip中的动画 2 选中 H
  • MySQL的auto_increment使用

    说明 总结自 mysql技术内幕 第5版 创建auto increment列要遵循如下规则 每个表只能有一个列具有auto increment属性 且必须为整数数据类型 当然 也支持浮点类型 但强烈不建议 该列必须建立索引 最常见的就是使用