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使用 的相关文章

  • 如何将 MySQL 查询输出保存到 Excel 或 .txt 文件? [复制]

    这个问题在这里已经有答案了 如何将 MySQL 查询的输出保存到 MS Excel 工作表 即使只能将数据存储在 txt文件 就可以了 From 将 MySQL 查询结果保存到文本或 CSV 文件中 http www tech recipe
  • 从 Grib 天气模型中提取数据

    我已经下载了grib1模型数据来自GFS http en wikipedia org wiki Global Forecast System 我使用的是 Mac OS X 并且能够构建wgrib2文件来自NOAA http en wikip
  • 在 django ORM 中查询时如何将 char 转换为整数?

    最近开始使用 Django ORM 我想执行这个查询 select student id from students where student id like 97318 order by CAST student id as UNSIG
  • MySQL - 多个结果集

    我正在使用 NET Connector 连接到 MySQL 在我的应用程序中 很少有线程使用相同的连接 因此如果 MySQLDataReader 尚未关闭并且某个线程正在尝试执行查询 则会出现该错误 已经有一个打开的 DataReader
  • MySQL 将表从 Latin1 转换为 utf8

    我需要将包含大量数据的表从 Latin1 转换为 utf8 以便它可以接受韩语字符 如何更改该表而不损坏其中的数据 我的 SQL 语句是什么 最好的方法是什么 ALTER TABLE database name table name CON
  • PDO语法错误

    我在一个项目中使用 PDO 但提交时出现语法错误 这是我的代码
  • MySQL 可选的带有 MATCH 的 LEFT JOIN

    我有以下查询 它对 MySQL Innodb 数据库中同一搜索词的两个不同表中的两列执行全文搜索 SELECT Id MATCH tb1 comment tb2 comment AGAINST search term IN BOOLEAN
  • MySQL 和 PHP 参数 1 作为资源

    好吧 当我运行下面提到的代码时 PHP 向我抛出此错误 在日志中 Error mysql num rows 期望参数 1 为资源 第 10 行 place 中给出的字符串 9 11号线 queryFP SELECT FROM db coun
  • MySQL - 从数字列表中选择在表的 id 字段中没有对应项的数字

    我有一个数字列表 例如 2 4 5 6 7 我有一个表 foos 带有 foos ID 包括 1 2 3 4 8 9 我想获取我的号码列表 并在我的表的 ID 字段中找到那些没有对应项的号码 实现此目的的一种方法是创建一个表格栏 在 ID
  • MySQL:如何仅获取正值的平均值?

    假设我有 INT 列 并且我使用 1 来表示插入时没有可用数据 我想获得该列中所有 0 或更大值的平均值 这可能吗 Thanks 我忘了提及 我正在与其他 AVG 一起执行此操作 因此从选项卡中选择 avg a avg b avg d 所以
  • MySQL 概念:会话与连接

    我对 MySQL 的概念有点困惑 会话与连接 当谈论连接到 MySQL 时 我们使用连接术语 连接池等 然而在 MySQL 在线文档中 http dev mysql com doc refman 4 1 en server system v
  • 使用用户定义函数 MySql 时出错

    您好 请帮我解决这个问题 提前致谢 我在数据库中定义了这些函数 CREATE FUNCTION levenshtein s1 VARCHAR 255 s2 VARCHAR 255 RETURNS INT DETERMINISTIC BEGI
  • rake db 问题:迁移 -

    我无法为 Ruby on Rails 设置 MySQL 数据库 设置数据库并确保 config database yml 文件匹配后 我遇到了以下错误消息 U Rails alpha gt rake db migrate trace in
  • MySQL NOT IN 来自同一个表中的另一列

    我想运行 mysql 查询来选择表中的所有行films其中的值title该列不存在于另一列的所有值中的任何位置 collection 这是我的表格的简化版本 其中包含内容 mysql gt select from films id titl
  • CakePHP 查找 - 按字符串到整数排序?

    我想使用 CakePHP 从数据库中提取照片数组 按照片标题排序 0 1 2 3 我的查询当前看起来像 ss photos this gt Asset gt find all array conditions gt array kind g
  • 如何从 MySQL 数据查询创建 XML 文件?

    我想知道一种仅使用 MySQL 查询创建 XML 文件的方法 根本不使用任何脚本语言 有关于这个主题的书籍 教程吗 UPDATE 我想澄清一下 我想使用 sql 查询将 XML 数据转发到 php 脚本 Here s 关于从 MySQL S
  • 来自数据库的 jfreechart 散点图

    如何使用java中的jfreechart绘制mysql数据库表中数据的散点图 我使用过 Swing 库 任何链接都会有帮助 我搜索了谷歌但找不到理解的解决方案 如果您有代码 请提供给我 实际上我确实做了条形图并使用 jfreechart 绘
  • MYSQL:如何在同一查询中联接两个表,两次引用同一个表

    我有两张桌子 我正在尝试将下面的示例两个表与表 1 引用表 2 两次结合起来 例如 如果我查看表 1 组 2 和成员 7 它应该查找表 2 中的 ID 并给出输出 Group Members Name Name 2 7 Blue Dog T
  • 研究MySQL、SQLite源码了解RDBMS实现[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我知道实现数据库是一个很大的话题 但我想通过研究数据库系统的源代码来基本了解数据库系统的工作原理 例如
  • 在 MySQL 数据库中保持 TEXT 字段唯一的最佳方法

    我想让 TEXT 字段的值在我的 MySQL 表中唯一 经过小型研究 我发现由于性能问题 每个人都不鼓励在 TEXT 字段上使用 UNIQUE INDEX 我现在想用的是 1 创建另一个字段来包含 TEXT 值的哈希值 md5 text v

随机推荐

  • 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属性 且必须为整数数据类型 当然 也支持浮点类型 但强烈不建议 该列必须建立索引 最常见的就是使用