mysql数据库 auto_increment_MYSQL数据库中的auto_increment
您的位置:首页 - 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相关推荐
- mysql数据库 auto_increment_mysql数据库 auto_increment
MySQL内核月报 2014.09-MySQL· 捉虫动态·auto_increment 背景: Innodb引擎使用B_tree结构保存表数据,这样就需要一个唯一键表示每一行记录(比如二级索引记录引 ...
- mysql values_values在数据库中是什么意思?
展开全部 看他们网上的,写得都是千篇一律,同时,好多也写得不是很好,e68a8462616964757a686964616f31333264636165下面是我自己总结的有关mysql的使用细节,也是 ...
- mysql数据库auto_MySQL数据库之auto_increment【转】
一.概述 在数据库应用中,我们经常需要用到自动递增的唯一编号来标识记录.在MySQL中,可通过数据列的auto_increment属性来自动生成.可在建表时可用"auto_increment ...
- JavaWeb - 数据库,MySQL安装卸载,MySQL服务器存储结构,sql语言,使用sql操作数据库/数据库表/表中记录,聚集函数,分组操作,limit关键字,重置root密码
转载请注明出处:https://blog.csdn.net/mythmayor/article/details/72781451 1.数据库的简介 (1)什么是数据库,就是一个文件系统,使用标准sql ...
- mysql数据库回滚日志_Mysql数据库应急响应中日志排查
常见的数据库攻击包括弱口令.SQL注入.提升权限.窃取备份等.对数据库日志进行分析,可以发现攻击行为,进一步还原攻击场景及追溯攻击源. 0x01 Mysql日志分析 general query log ...
- mysql 密码 特殊符号_MySQL数据库之mysql设置复杂密码中含$特殊符号导致无法命令行登录...
本文主要向大家介绍了MySQL数据库之mysql设置复杂密码中含$特殊符号导致无法命令行登录 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. 安全考虑 在设置MYSQL 密码时候 ...
- MySQL工作中的实际用_数据库在工作中的应用,以及什么是MySQL?
数据库在工作中的应用: 1.软件都需要数据库(database)作为后台支撑 2.部署测试环境需要安装.配置数据库 3.数据库(database)中构造初始化数据 4.测试执行过程中需要验证数据库(d ...
- ssh项目同时使用mysql跟sqlserver数据库_MSSQL_如何把sqlserver数据迁移到mysql数据库及需要注意事项,在项目开发中,有时由于项目 - phpStudy...
如何把sqlserver数据迁移到mysql数据库及需要注意事项 在项目开发中,有时由于项目开始时候使用的数据库是SQL Server,后来把存储的数据库调整为MySQL,所以需要把SQL Serve ...
- MYSQL,Oracle,SQL数据库在JSP中的驱动
MYSQL,Oracle,SQL数据库在JSP中的驱动 datasource.url=jdbc:mysql://localhost:3306/bbscs6?useUnicode=true&ch ...
最新文章
- 转载【C】堆区和栈区的区别
- Fluently NHibernate 插入CLOB字段
- 面试:字符串拼接,什么时候用StringBuilder?
- C++突破private的方案
- 揽货最短路径解决方案算法 - C# 蚁群优化算法实现
- HDU6428-Calculate-数论函数
- idea 启动界面导入项目_如何为您的项目启动有效的登录页面
- Loadrunner中对中文进行UTF-8转码的探索
- TIA Portal
- 曙光:卖市场上没有的产品
- android 安装包反编译,Android逆向之反编译APK和安装包漏洞解析
- 前端H5面试题(总结)
- PS如何为图片添加四面投影
- Python应用|TOPSIS综合评价法与案例分析
- qfiledialog保存时为文件名添加后缀
- 索引额外问题之最左匹配原则的成因
- 斩不断、理还乱,论家事,别有一番滋味在心头。
- 实验吧-猫抓老鼠 Writeup
- c语言日期加减天数,日期计算器
- 反向代理haproxy用法详解