MySQL的AUTO_INCREMENT

此文章为转载


用法:

CREATE TABLE test
(
id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(15) NOT NULL
)
AUTO_INCREMENT = 100;

在数据库应用,我们经常要用到唯一编号,以标识记录。在MySQL中可通过数据列的AUTO_INCREMENT属性来自动生成。MySQL支持多种数据表,每种数据表的自增属性都有差异,这里将介绍各种数据表里的数据列自增属性。

    *

      ISAM表
          o

            如果把一个NULL插入到一个AUTO_INCREMENT数据列里去,MySQL将自动生成下一个序列编号。编号从1开始,并1为基数递增。
          o

            把0插入AUTO_INCREMENT数据列的效果与插入NULL值一样。但不建议这样做,还是以插入NULL值为好。
          o

            当插入记录时,没有为AUTO_INCREMENT明确指定值,则等同插入NULL值。
          o

            当插入记录时,如果为AUTO_INCREMENT数据列明确指定了一个数值,则会出现两种情况,情况一,如果插入的值与已有的编号重复,则会出现出错信息,因为AUTO_INCREMENT数据列的值必须是唯一的;情况二,如果插入的值大于已编号的值,则会把该插入到数据列中,并使在下一个编号将从这个新值开始递增。也就是说,可以跳过一些编号。
          o

            如果自增序列的最大值被删除了,则在插入新记录时,该值被重用。
          o

            如果用UPDATE命令更新自增列,如果列值与已有的值重复,则会出错。如果大于已有值,则下一个编号从该值开始递增。
          o

            如果用replace命令基于AUTO_INCREMENT数据列里的值来修改数据表里的现有记录,即AUTO_INCREMENT数据列出现在了 replace命令的where子句里,相应的AUTO_INCREMENT值将不会发生变化。但如果replace命令是通过其它的PRIMARY KEY OR UNIQUE索引来修改现有记录的(即AUTO_INCREMENT数据列没有出现在replace命令的where子句中),相应的 AUTO_INCREMENT值--如果设置其为NULL(如没有对它赋值)的话--就会发生变化。
          o

            last_insert_id()函数可获得自增列自动生成的最后一个编号。但该函数只与服务器的本次会话过程中生成的值有关。如果在与服务器的本次会话中尚未生成AUTO_INCREMENT值,则该函数返回0。

      其它数据表的自动编号机制都以ISAM表中的机制为基础。
    *

      MyISAM数据表
          o

            删除最大编号的记录后,该编号不可重用。
          o

            可在建表时可用“AUTO_INCREMENT=n”选项来指定一个自增的初始值。
          o

            可用alter table table_name AUTO_INCREMENT=n命令来重设自增的起始值。
          o

            可使用复合索引在同一个数据表里创建多个相互独立的自增序列,具体做法是这样的:为数据表创建一个由多个数据列组成的PRIMARY KEY OR UNIQUE索引,并把AUTO_INCREMENT数据列包括在这个索引里作为它的最后一个数据列。这样,这个复合索引里,前面的那些数据列每构成一种独一无二的组合,最末尾的AUTO_INCREMENT数据列就会生成一个与该组合相对应的序列编号。
    *

      HEAP数据表
          o

            HEAP数据表从MySQL4.1开始才允许使用自增列。
          o

            自增值可通过CREATE TABLE语句的 AUTO_INCREMENT=n选项来设置。
          o

            可通过ALTER TABLE语句的AUTO_INCREMENT=n选项来修改自增始初值。
          o

            编号不可重用。
          o

            HEAP数据表不支持在一个数据表中使用复合索引来生成多个互不干扰的序列编号。
    *

      BDB数据表
          o

            不可通过CREATE TABLE OR ALTER TABLE的AUTO_INCREMENT=n选项来改变自增初始值。
          o

            可重用编号。
          o

            支持在一个数据表里使用复合索引来生成多个互不干扰的序列编号。
    *

      InnDB数据表
          o

            不可通过CREATE TABLE OR ALTER TABLE的AUTO_INCREMENT=n选项来改变自增初始值。
          o

            不可重用编号。
          o

            不支持在一个数据表里使用复合索引来生成多个互不干扰的序列编号。

在使用AUTO_INCREMENT时,应注意以下几点:

    *

      AUTO_INCREMENT是数据列的一种属性,只适用于整数类型数据列。
    *

      设置AUTO_INCREMENT属性的数据列应该是一个正数序列,所以应该把该数据列声明为UNSIGNED,这样序列的编号个可增加一倍。
    *

      AUTO_INCREMENT数据列必须有唯一索引,以避免序号重复。
    *

      AUTO_INCREMENT数据列必须具备NOT NULL属性。
    *

      AUTO_INCREMENT数据列序号的最大值受该列的数据类型约束,如TINYINT数据列的最大编号是127,如加上UNSIGNED,则最大为255。一旦达到上限,AUTO_INCREMENT就会失效。
    *

      当进行全表删除时,AUTO_INCREMENT会从1重新开始编号。全表删除的意思是发出以下两条语句时:

      delete from table_name;ortruncate table table_name

      这是因为进行全表操作时,MySQL实际是做了这样的优化操作:先把数据表里的所有数据和索引删除,然后重建数据表。如果想删除所有的数据行又想保留序列编号信息,可这样用一个带where的delete命令以抑制MySQL的优化:

      delete from table_name where 1;

      这将迫使MySQL为每个删除的数据行都做一次条件表达式的求值操作。
    *

      强制MySQL不复用已经使用过的序列值的方法是:另外创建一个专门用来生成AUTO_INCREMENT序列的数据表,并做到永远不去删除该表的记录。当需要在主数据表里插入一条记录时,先在那个专门生成序号的表中插入一个NULL值以产生一个编号,然后,在往主数据表里插入数据时,利用 LAST_INSERT_ID()函数取得这个编号,并把它赋值给主表的存放序列的数据列。如:

      insert into id set id = NULL;insert into main set main_id = LAST_INSERT_ID();

    *

      可用alter命令给一个数据表增加一个具有AUTO_INCREMENT属性的数据列。MySQL会自动生成所有的编号。
    *

      要重新排列现有的序列编号,最简单的方法是先删除该列,再重建该,MySQL会重新生连续的编号序列。
    *

      在不用AUTO_INCREMENT的情况下生成序列,可利用带参数的LAST_INSERT_ID()函数。如果用一个带参数的 LAST_INSERT_ID(expr)去插入或修改一个数据列,紧接着又调用不带参数的LAST_INSERT_ID()函数,则第二次函数调用返回的就是expr的值。下面演示该方法的具体操作:

      先创建一个只有一个数据行的数据表:create table seq_table (id int unsigned not null);insert into seq_table values (0);接着用以下操作检索出序列号:
      update seq_table set seq = LAST_INSERT_ID( seq + 1 );select LAST_INSERT_ID();
      通过修改seq+1中的常数值,可生成不同步长的序列,如seq+10可生成步长为10的序列。

      该方法可用于计数器,在数据表中插入多行以记录不同的计数值。再配合LAST_INSERT_ID()函数的返回值生成不同内容的计数值。这种方法的优点是不用事务或LOCK,UNLOCK表就可生成唯一的序列编号。不会影响其它客户程序的正常表操作。 





如何在MySQL中重置AUTO_INCREMENT 在MySQL数据库中,是一个非常有用的属性,通常用于为表中的主键字段自动生成唯一的递增数值。然而,在某些情况下,如测试环境重置、数据清理或特定业务需求,我们可能需要重置的计数器,使其重新从某个特定值开始计数,例如从 1 开始。 阅读详情

相关推荐

【一个表中可以有多个自增列吗?】

【一个表中可以有多个自增列吗?】

学无止境 1354

8.MySQL的自增(AUTO_INCREMENT)

目录 1.为什么需要自增 2.语法 3.注意 4.演示 5.查看自动增长值 6.修改自动增长 7.删除自动增长 8.添加自动增长 1.为什么需要自增 为数据表设置主键约束后,每次插入记录时,如果插入的值已经存在,会插入失败。为主键生成自动增长的值可以解决这种问题。 2.语法 字段名 数据类型 AUTO_INCREMENT 3.注意 一个表中只能有一个自动增长字段 ...

码海无际的博客 2684

手教你如何使用Simulink和相关工具箱模拟和实现无人机的多机接力信号中继的建模

扩大通信范围:单架无人机的通信能力有限,通过多机接力的方式可以显著扩展通信覆盖范围。提高可靠性:当某架无人机出现故障或电量不足时,其他无人机可以接管其任务,确保通信不中断。适应复杂环境:在山区、森林等复杂地形中,多机接力可以绕过障碍物,建立稳定的通信链路。使用Communications Toolbox中的模块来模拟无线通信链路。例如,可以使用模块模拟噪声信道,或者使用模块计算信号衰减。matlab深色版本。

MHD0815的博客 767

MySQL的InnoDB表、自增字段(AUTO_INCREMENT)处理

1、创建InnoDB表 mysql> SELECT @@default_storage_engine; //查看默认存储引擎 +--------------------------+ | @@default_storage_engine | +--------------------------+ | InnoDB | +----------------...

yyyxxxs的博客 1027

实战分享:如何用YOLOv5s+BIFPN高效检测隧道裂缝(附数据集获取)

本文详细介绍了如何利用YOLOv5s结合BIFPN(双向特征金字塔网络)构建高效的隧道裂缝智能检测系统。文章从高质量数据集构建、针对性数据增强、模型架构选型与调优,到工程化部署全链路进行了实战分享,旨在为基础设施自动化巡检提供兼顾精度与速度的解决方案。

weixin_29062823的博客 380

安装了anaconda,pycharm导入numpy时提示没有该包(模块)?

**问题详情:**我安装了anaconda,在利用Pycharm学习numpy这个库的时候,导入numpy这个包的时候提示我没有nummpy这个模块:No module named numpy.如下图所示。 应该说安装了Anaconda,里边就自带了numpy这个库,就应该能够使用。我一个新手怎么搞得懂呢?于是网上查了查找到了一个解决办法,说是我项目的解释器应该设置为Anaconda安装目录下的python.exe,而不应该是系统自带的:https://blog.youkuaiyun.com/aanndd77/art

qq_39820505的博客 1万+

MySQL中的auto_increment

文章目录一、AUTO_INCREMENT1.1 测试二、auto_increment_increment和auto_increment_offset2.1 解释2.2 测试auto_increment_incrementauto_increment_offset当两者同时更改三.组复制中的group_replication_auto_increment_increment1.解释2.操作2.1 配置2.2 插数据 一、AUTO_INCREMENT AUTO_INCREMENT 属性可用于为新行生成唯一标识

耿进 7632

Mac版UltraEdit 18.00.0.19破解教程:终端一行命令搞定(附版本适配指南)

本文为Mac用户提供了UltraEdit的合法替代方案与授权指南,强调破解软件的法律风险和安全隐忧。推荐使用VS Code、Sublime Text等开源或商业编辑器,结合终端工具如Vim/Neovim,实现高效文本编辑。同时详细介绍了UltraEdit的官方授权选项,帮助开发者在遵守软件许可的前提下提升工作效率。

k9l0m1的博客 357

Mysql设置auto_increment_increment和auto_increment_offset

查看与设置: show variables like '%auto_inc%'; show session variables like '%auto_inc%'; -- //session会话变量 show global variables like '%auto_inc%'; -- //全局变量 SET @auto_increment_in...

xinyuan的专栏 2万+

Qt c++ llama.cpp 运行 LLaMA-3-8B 中文对话机器人(多模态输入)

助手:

寒寒豆豆软件公司的博客 219

matlab 异常值检测与处理——Robust Z-score法【2024最新版】

博客长期更新,本文最近一次更新时间为:2024年12月9日。

点云侠的博客 1516

mysql的auto_increment

auto_increment作用:用来指定一个自增的初始值; 如果不指定值默认初始值为1 建表语句 插入数据 插入第一个数据可以看到id是从2开始 自增主键不能保证连续递增 在空表执行insert into aa values(null,1,1); 插入一条数据后,再执行show create table命令 表定义中AUTO_INCREMENT=3,表示下一次插入数据时,如果要自动生成自增值,会生成id=3。 自增值保存在表结构定义里。实际上,表结构定义存放在后缀名为.frm的文件中,但

大菜菜的博客 1万+

jsqlparser 版本不兼容:net.sf.jsqlparser.statement.select.SelectItem 以及 select.SelectBody 解决方法

看Bug直接定位到最后面的错误提示,一开始以为是UnabletostartembeddedTomcat的基本错误,后续发现排查方向错误!问题比较复杂,不过这类问题可看:出现WebServerException:UnabletostartembeddedTomcat解决方法(全)

码农研究僧的博客 2673

mysql auto increment offset_MySQL auto_increment_increment,auto_increment_offset 用法

MySQL中对于表上ID自增列可以在创建表的时候来指定列上的auto_increment属性;等同于SQL server中的identity属性;Oracle则是通过Sequence方式来实现。在MySQL中,系统变量auto_increment_increment,auto_increment_offset 影响自增列的值及其变化规则。本文主要描述这两个系统变量的相关用法。1、auto_incr...

weixin_34154352的博客 2463

Linux(31)Rockchip RK3568 Ubuntu22.04上部署 Docker: 问题与解决方案

本博客在总结这些问题及其解决方案,为遇到类似问题的兄弟提供参考,如果我后续有碰到其他Docker 问题也会在此更新补充。

我其实什么都不会 1646

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

MYSQL中的auto_increment_increment和auto_increment_offset

这两个参数在MYSQL中大致有两个作用 控制自增列AUTO_INCREMENT的行为用于MASTER-MASTER之间的复制,防止出现重复值 下面从网上摘录了一些资料,分别对这两个方面进行解释 ############################ auto_i

朝着梦想 渐行前进 1万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

MySQL的auto_increment使用

说明 总结自《mysql技术内幕(第5版)》 创建auto_increment列要遵循如下规则 每个表只能有一个列具有auto_increment属性,且必须为整数数据类型(当然,也支持浮点类型,但强烈不建议) 该列必须建立索引,最常见的就是使用primary key或unique索引,当然,也支持不唯一索引 该列必须是not null的 auto_increment列将有如下特性 用ins...

雪非白的博客 5019

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

mysql auto_increment_increment_mysql中auto_increment的incrementoffset

auto_increment_increment和auto_increment_offset可以在全局global,本地session或者local动态设置这两个参数以控制auto_increment的增量与偏移量。当修改auto_increment_offset之后的第一个auto_increment值一定是能够满足大于当前auto_increment最大值的最小倍数值,之后再插入新值增量就为a...

weixin_30798867的博客 460

mysql建表auto_increment_mysql create table auto_increment

当插入记录时,没有为AUTO_INCREMENT明确指定值,则等同插入NULL值把0插入AUTO_INCREMENT数据列的效果与插入NULL值一样。但不建议这样做,还是以插入NULL值为好。如果把一个NULL插入到一个AUTO_INCREMENT数据列里去,MySQL将自动生成下一个序 列编号。默认编号从1开始(如果未指定auto_increment开始值,如果指定开始值,则从指定值开始, 比如...

weixin_32329555的博客 4463

如何在MySQL中重置AUTO_INCREMENT?

How can I reset the AUTO_INCREMENT of a field? 如何重置字段的AUTO_INCREMENT ? I want it to start counting

p15097962069的博客 1732

[mysql]原理之auto_increment

引言 MySQL中auto_increment字段估计大家都经常用到,特别是innodb引擎。我也经常用,只知道mysql可以保证这个字段在多进程操作时的原子性,具体原理又是什么,后来查阅了MySQL手册以及相关资料,了解了个大概。 本文只探究了mysql5.5中innodb引擎auto_increment的问题。 定义 使用auto_increment的字段可能生成唯一的标识。 如何使...

wuhaifei 841

mysql数据库 auto_increment_mysql学习笔记(二:中的auto_increment 理解

1、auto_increment理解1auto_increment是用于主键自动增长的,从1开始增长,当你把第一条记录删除时,再插入第二跳数据时,主键值是2,不是1。例如:create table `test`(`id` int(10) not null auto_increment, -- 表示自增列`name` varchar(20) not null,primary key(`id`))au...

weixin_29306011的博客 1万+

mysql的auto_increment详解

auto_increment的基本特性 MySQL的中AUTO_INCREMENT类型的属性用于为一个表中记录自动生成ID功能,可在一定程度上代替Oracle,PostgreSQL等数据库中的sequence。 在数据库应用,我们经常要用到唯一编号,以标识记录。在MySQL中可通过数据列的AUTO_INCREMENT属性来自动生成。 可在建表时可用“AUTO_INCREMENT=n”

fwkjdaghappy1的专栏 6万+

MySQL之auto_increment问题记录

概述 在数据库应用中,经常用到自动递增的唯一编号来标识记录。在MySQL中,可通过数据列的auto_increment属性来自动生成。可在建表时可用“auto_increment=n”选项来指定一个自增的初始值。可用“alter table table_name auto_increment=n”命令来重设自增的起始值,当然在设置的时候MySQL会取数据表中auto_increment列的最大值...

浅汐 4万+

mysql数据库 auto_increment_MYSQL数据库中的auto_increment

您的位置:首页 - MYSQL - 正文MYSQL数据库中的auto_increment在MySQL中,经常使用 AUTO_INCREMENT对主键建立自增id的行为,MySQL会自行保证主键ID的自增与不重复,使程序不需对ID进行关注。但是在使用时,MySQL对auto_increment对管理的一些特性可能会导致一些问题,所以需要手工对其进行修改。修改AUTO_INCREMENT,MySQL只...

weixin_39603622的博客 1794
上一篇: 正确使用<!DOCTYPE html PUBLIC
下一篇: PHP中如何运用ini_set和ini_get()
KeVinCode_007
博客等级 码龄20年 1粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值