您的位置:首页 - MYSQL - 正文

MYSQL数据库中的auto_increment

在MySQL中,经常使用 AUTO_INCREMENT对主键建立自增id的行为,MySQL会自行保证主键ID的自增与不重复,使程序不需对ID进行关注。

但是在使用时,MySQL对auto_increment对管理的一些特性可能会导致一些问题,所以需要手工对其进行修改。

修改AUTO_INCREMENT,MySQL只需一条非常简单的命令:

ALTER TABLE t1 AUTO_INCREMENT = 13;

需要注意,在InnoDB引擎下,如果修改的目标值小于当前数据库中ID的最大值,则数据库不会有任何变化。

在MyISAM引擎下,如果修改的目标值小于当前数据库中ID的最大值,则AUTO_INCREMENT会被设置为该最大值。

在前几天的工作中,为了保证ID的范围,对数据库的AUTO_INCREMENT进行了修改,发现了一些问题。

当在使用ALTER TABLE mytable AUTO_INCREMENT = N修改AUTO_INCREMENT值时,

即使没有对数据结构进行变化,MySQL服务器(操作的服务器为MySQL5.5,innodb引擎)也会自动建立一个新的表,然后将所有数据复制到新表中,

再将旧表删除,并重命名新表。

同时,在返回的结果中可以看到,所有的行都被affected。

例如:

mysql> alter table mytable auto_increment=1000000;

Query OK, 512691 rows affected (1 min 4.55 sec)

Records: 512691 Duplicates: 0 Warnings: 0

经过查询,发现这是在使用ALTER TABLE命令时常见的情况,同时AUTO_INCREMENT在MySQL5.5中不属于可以跳过重建操作的命令

这就带来一个问题,在进行修改AUTO_INCREMENT时,整个表会被加锁,不能修改,影响正常服务。如果表里的数据量非常大,则复制数据会相当的花时间。

同时也可能带来其他的不可预知的问题,例如硬盘空间被零时表大量占用的问题。

在查询了MySQL官方文档与相关资料后发现了一些可以快速解决的方案:

1、如果需要将AUTO_INCREMENT变大,则可以通过很方便的手段进行操作,首先插入一行傀儡数据,插入时将该行数据的ID设置为AUTO_INCREMENT的目标值-1。

进行此操作后,则AUTO_INCREMENT会自动变为你嗦需要设置的目标值。

但是这种方法仅适用于将AUTO_INCREMENT改大的情况,无法将AUTO_INCREMENT改小。

2、如果需要快速的将AUTO_INCREMENT改小,则需要利用innodb的特性。

在InnoDB中,使用的是内存自增计数器,也就是说,AUTO_INCREMENT不会写入到硬盘中。

每次重启数据库服务后,MySQL会自动运行命令

SELECT MAX(ai_col) FROM table_name FOR UPDATE;

以获取最大的ID,并赋值到AUTO_INCREMENT中作为计数器的新值。

利用这一点,我们就可以快速的修改AUTO_INCREMENT的值:首先删除所有比目标值大的ID的行,然后重启数据库,再使用之前改大的方法设置AUTO_INCREMENT

MySQL 的语法

下列 SQL 语句把 "Persons" 表中的 "P_Id" 列定义为 auto-increment 主键:

CREATE TABLE Persons

(

P_Id int NOT NULL AUTO_INCREMENT,

LastName varchar(255) NOT NULL,

FirstName varchar(255),

Address varchar(255),

City varchar(255),

PRIMARY KEY (P_Id)

)

MySQL 使用 AUTO_INCREMENT 关键字来执行 auto-increment 任务。

默认地,AUTO_INCREMENT 的开始值是 1,每条新记录递增 1。

要让 AUTO_INCREMENT 序列以其他的值起始,请使用下列 SQL 语法:

ALTER TABLE Persons AUTO_INCREMENT=100

要在 "Persons" 表中插入新记录,我们不必为 "P_Id" 列规定值(会自动添加一个唯一的值):

INSERT INTO Persons (FirstName,LastName)

VALUES ('Bill','Gates')

上面的 SQL 语句会在 "Persons" 表中插入一条新记录。"P_Id" 会被赋予一个唯一的值。"FirstName" 会被设置为 "Bill","LastName" 列会被设置为 "Gates"。

评论:

mysql数据库 auto_increment_MYSQL数据库中的auto_increment相关推荐

  1. mysql数据库 auto_increment_mysql数据库 auto_increment

    MySQL内核月报 2014.09-MySQL· 捉虫动态·auto_increment 背景: Innodb引擎使用B_tree结构保存表数据,这样就需要一个唯一键表示每一行记录(比如二级索引记录引 ...

  2. mysql values_values在数据库中是什么意思?

    展开全部 看他们网上的,写得都是千篇一律,同时,好多也写得不是很好,e68a8462616964757a686964616f31333264636165下面是我自己总结的有关mysql的使用细节,也是 ...

  3. mysql数据库auto_MySQL数据库之auto_increment【转】

    一.概述 在数据库应用中,我们经常需要用到自动递增的唯一编号来标识记录.在MySQL中,可通过数据列的auto_increment属性来自动生成.可在建表时可用"auto_increment ...

  4. JavaWeb - 数据库,MySQL安装卸载,MySQL服务器存储结构,sql语言,使用sql操作数据库/数据库表/表中记录,聚集函数,分组操作,limit关键字,重置root密码

    转载请注明出处:https://blog.csdn.net/mythmayor/article/details/72781451 1.数据库的简介 (1)什么是数据库,就是一个文件系统,使用标准sql ...

  5. mysql数据库回滚日志_Mysql数据库应急响应中日志排查

    常见的数据库攻击包括弱口令.SQL注入.提升权限.窃取备份等.对数据库日志进行分析,可以发现攻击行为,进一步还原攻击场景及追溯攻击源. 0x01 Mysql日志分析 general query log ...

  6. mysql 密码 特殊符号_MySQL数据库之mysql设置复杂密码中含$特殊符号导致无法命令行登录...

    本文主要向大家介绍了MySQL数据库之mysql设置复杂密码中含$特殊符号导致无法命令行登录 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. 安全考虑 在设置MYSQL 密码时候 ...

  7. MySQL工作中的实际用_数据库在工作中的应用,以及什么是MySQL?

    数据库在工作中的应用: 1.软件都需要数据库(database)作为后台支撑 2.部署测试环境需要安装.配置数据库 3.数据库(database)中构造初始化数据 4.测试执行过程中需要验证数据库(d ...

  8. ssh项目同时使用mysql跟sqlserver数据库_MSSQL_如何把sqlserver数据迁移到mysql数据库及需要注意事项,在项目开发中,有时由于项目 - phpStudy...

    如何把sqlserver数据迁移到mysql数据库及需要注意事项 在项目开发中,有时由于项目开始时候使用的数据库是SQL Server,后来把存储的数据库调整为MySQL,所以需要把SQL Serve ...

  9. MYSQL,Oracle,SQL数据库在JSP中的驱动

    MYSQL,Oracle,SQL数据库在JSP中的驱动 datasource.url=jdbc:mysql://localhost:3306/bbscs6?useUnicode=true&ch ...

最新文章

  1. 转载【C】堆区和栈区的区别
  2. Fluently NHibernate 插入CLOB字段
  3. 面试:字符串拼接,什么时候用StringBuilder?
  4. C++突破private的方案
  5. 揽货最短路径解决方案算法 - C# 蚁群优化算法实现
  6. HDU6428-Calculate-数论函数
  7. idea 启动界面导入项目_如何为您的项目启动有效的登录页面
  8. Loadrunner中对中文进行UTF-8转码的探索
  9. TIA Portal
  10. 曙光:卖市场上没有的产品
  11. android 安装包反编译,Android逆向之反编译APK和安装包漏洞解析
  12. 前端H5面试题(总结)
  13. PS如何为图片添加四面投影
  14. Python应用|TOPSIS综合评价法与案例分析
  15. qfiledialog保存时为文件名添加后缀
  16. 索引额外问题之最左匹配原则的成因
  17. 斩不断、理还乱,论家事,别有一番滋味在心头。
  18. 实验吧-猫抓老鼠 Writeup
  19. c语言日期加减天数,日期计算器
  20. 反向代理haproxy用法详解

热门文章

  1. 滴水逆向3期笔记与作业——01汇编
  2. 车机开发之添加自定义键
  3. 零基础做油管搬运二创项目的正确方式,短视频小白玩家套利的可能
  4. 为什么需要第三方支付?
  5. W3school:CSS基础:CSS注释、颜色(颜色、RGB、HEX、HSL)、背景(背景、背景图像、背景重复、背景附着、简写背景属性)
  6. DLink624+A拨号失败的问题
  7. 小红书直播收益怎么算?有效提高直播收益的小技巧
  8. vue生命周期(简短精干篇)
  9. C++析取器在代码自动化测试中的应用
  10. [摘记]数值方法02——内插法和外推法