在mysql数据库中,使用auto_increment 字段来辅助为自增列赋值。

显示有关msyql自增ID的相关配置信息:

复制代码 代码示例:

SHOW VARIABLES LIKE 'auto_incre%';

输出:

auto_increment_increment 1

auto_increment_offset 1

说明:

auto_increment_increment  = 1 ,每次插入数据,id++;auto_increment_offset =1 ,说明从1开始。

一般情况下auto_increment_increment=1,auto_increment_offset=1.是默认初始值。

可以在my.cnf文件中进行重新指定。auto_increment满足一个数学当纳法推导公式:

value=auto_increment_increment*N+auto_increment_offset

表中有auto_increment列,innodb用一种锁策略来保正这个auto_increment列值。

如果创建一个表,指定了auto_increment表。那么innodb会维护一个auto_increment计数器。

当访问这个计数器,innodb会使用表级锁来锁定这访问过程,这个发生在分析auto_increment

值的过程中,而不是在一个执行事务中。也就是说:这个访问发生在事务执行前面。

所以和这个锁不是发生整个事务过程中,仅仅是分析语句判断出auto_increment这一过程中。

auto_increment计数器,一直维护在内存中,当server重启或是停止后重启,innodb会为每个表初始化这个计数器。

对一个含有自增列(通常为id)的表执行

mysql> SHOW CREATE TABLE table_name;

输出:

复制代码 代码示例:

CREATE TABLE `news` (

`id` bigint(20) NOT NULL AUTO_INCREMENT,

`title` varchar(255) NOT NULL,

`url` varchar(255) NOT NULL,

`pub_date` datetime NOT NULL,

`site` tinyint(4) NOT NULL,

`created_at` datetime NOT NULL,

`updated_at` datetime DEFAULT NULL,

`org` varchar(255) DEFAULT NULL,

`author` varchar(255) DEFAULT NULL,

`trend` tinyint(4) DEFAULT '-1',

`md5url` char(32) NOT NULL,

`content` longtext NOT NULL,

PRIMARY KEY (`id`),

UNIQUE KEY `md5url` (`md5url`),

KEY `pub_date` (`pub_date`),

KEY `created_at` (`created_at`),

KEY `title` (`title`)

) ENGINE=InnoDB AUTO_INCREMENT=704677 DEFAULT CHARSET=utf8

其中该状态下,表中AUTO_INCREMENT 字段值为704677 ,说明下一个插入的id 为704677 ,同时插入成功后,AUTO_INCREMENT=704678。

mysql 数据库中的id设为自增,容易产生id不连续的问题。

有时将一个表中的所有数据清除,但是在插入数据时,id还是在未清除前的基础上累加。

需要解决如下问题:

1. 删除数据,同时要求再次插入数据时,id从1 开始累计

复制代码 代码示例:

1)、TRUNCATE TABLE table_name;

2)、DELETE FROM table_name;

ALTER TABLE table_name auto_increment =1 ;

分析:

Truncate table 表名 速度快,而且效率高,因为:TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行。

但是,TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少。DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项。TRUNCATE TABLE 通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。

TRUNCATE TABLE 删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用 DELETE。如果要删除表定义及其数据,请使用 DROP TABLE 语句。

2,查看当前状态下一个表的auto_increment 值:

SHOW TABLE STATUS LIKE 'table_name'输出:

Name: ddx

Engine: InnoDB

Version: 10

Row_format: Compact

Rows: 2449

Avg_row_length: 93

Data_length: 229376

Max_data_length: 0

Index_length: 114688

Data_free: 0

Auto_increment: 2353

Create_time: 2012-05-02 12:54:55

Update_time: NULL

Check_time: NULL

Collation: utf8_general_ci

Checksum: NULL

Create_options:

Comment:

可以查看该表当前的Auto_increment的值。

3,对有些失败插入操作,如果不是语法错误,比如重复的唯一键值,也会造成自增id的不连续。

4,mysql5.1.22之前,innodb使用一个表锁解决自增字段的一致性问题(内部是用一个计数器维护,每次自增时要加表锁),如果一行一行的插入数据则没有什么问题,但是如果大量的并发插入就废了,表锁会引起SQL堵塞,不但影响效率,而且可能会瞬间达到max_connections而崩溃。

在 5.1.22之后,innodb使用新的方式解决自增字段一致性问题,对于可以预判行数的insert语句,innodb使用一个轻量级的互斥量。如:某一insert语句1执行前,表的AUTO_INCREMENT=1,语句1的插入行数已知为3,innodb在语句1的实际插入操作执行前就预分配给该语句三个自增值,当有一个新的insert语句2要执行时,读取的AUTO_INCREMENT=4,这样虽然语句1可能还没有执行完,语句2就可直接执行无需等待语句2。

这种方式对于可预判插入行数的插入语句有效,如:insert和replace。对于无法提前获知插入行数的语句,如:insert...select...、replace...select...和load data则innodb还是使用表锁。

insert语句中有时会显示的设置自增字段的值,对于这种情况innodb还是会预分配给语句总行数的自增值而不是只有实际使用系统自增的行。因而有可能会造成自增字段的值不连续。

例如:

INSERT INTO t1 (c1,c2) VALUES (1,'a'), (NULL,'b'), (5,'c'), (NULL,'d'); c1 为自增字段,实际的AUTO_INCREMENT 会大2。

设置新自增互斥方式:

通过配置选项:innodb_autoinc_lock_mode,它是专门用来在使用auto_increment的情况下调整锁策略的。

目前有三种选择:

innodb_autoinc_lock_mode = 0 (“traditional” lock mode:全部使用表锁)

innodb_autoinc_lock_mode = 1 (默认)(“consecutive” lock

mode:可预判行数时使用新方式,不可时使用表锁)

innodb_autoinc_lock_mode = 2 (“interleaved” lock

mode:全部使用新方式,不安全,不适合replication)

mysql数据库自增_mysql数据库自增id用法大全相关推荐

  1. mysql 修复表字段_mysql数据库总结一【安装,配置,表操作,字段操作,增删改, 备份-恢复,select查询】...

    服务器端安装 安装服务器端:在终端中输入如下命令,回车后,然后按照提示输入 sudo apt-get install mysql-server 启动服务 sudo service mysql star ...

  2. 初识mysql数据字段属性_MySQL数据库~~~~初识、基础数据类型

    一 数据库初识 1.1 什么是数据库 数据库(DataBase,简称DB),简而言之可视为电子化的文件柜----存储电子文件的处所,用户可以对文件中的数据运行新增,截取,更新,删除等操作. 所谓数据库 ...

  3. php中mysql自增_MySQL的自增字段

    1.关键字 auto_increment 2.自增用法 例: CREATE TABLE animals ( id mediumint not null auto_increment, name cha ...

  4. mysql 导出dmp文件_MySQL数据库基础讲解

    # 简介 MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),使用最常用的数据库管理语言(SQL)进行数据库管理. MySQL是开放源代码的,因此任何人都可以在General Publi ...

  5. dos窗口mysql创建数据库指定字符集_MySQL数据库 dos 命令窗口命令集

    一.DDL:数据库定义语言 数据库的操作:(操作关键字不分大小写) create database day01;//创建数据库 show databases;//查看该帐号下的所有数据库 show c ...

  6. mysql数据基本指令_mysql数据库常用命令(详细)

    mysql数据库常用命令(详细) *************************************************** windows下mysql的启动与停止 启动MYSQL服务 n ...

  7. mysql数据库端口链接_mysql数据库端口链接

    高校计划ESC7天训练营-PolarDB搭建门户网站 Day04打卡 创建PolarDB数据库账号 使用无痕模式登录子账号 左侧侧边栏-产品与服务-云数据库PolarDB,进入PolarDB管理器 点 ...

  8. mysql数据库版本回退_mysql数据库

    数据库的简介 数据库 数据库(database,DB)是指长期存储在计算机内的,有组织,可共享的数据的集合.数据库中的数据按一定的数学模型组织.描述和存储,具有较小的冗余,较高的数据独立性和易扩展性, ...

  9. mysql数据库名语法_mysql数据库常用语法

    1)登录mysql数据库. mysql –uroot –poldboy123 mysql 2) 查看当前登录的用户. selectuser(); 3) 创建数据库oldboy,并查看已建库完整语句. ...

  10. mysql进入数据库命令_mysql 数据库基础命令

    数据库命令: 进入 mysql 库; use mysql; 查看用户权限 select * from user where user='root' \G; 创建数据库 create database ...

最新文章

  1. [Hibernate系列—] 2. 创建SessionFactory 与 Session
  2. Spring中的容器
  3. 洛谷P3810 【模板】三维偏序(陌上花开) CDQ分治初探
  4. 【VMCloud云平台】SCCM(五)创建第一个集合
  5. 通过日志审计追踪外部***
  6. 给属性赋值_赋值方法:虚拟变量 Dummy Coding
  7. shell脚本实现FTP自动上传文件
  8. OpenCV3.0.0 + VS2012 的环境搭建
  9. 临床基因组分析相关数据库汇总
  10. Tensorflow从指定链接下载文件
  11. mui android 模拟器,MUI框架-07-HBuilder+夜神安卓模拟器
  12. NH7020固件网口分析与platoSDR固件对比
  13. C++ printf打印二进制,三进制,八进制,十六进制等(利用itoa)
  14. Cisco Packet Tracer Student的路由器接口配置
  15. jacob为word和excel加水印
  16. angular 自定义打包文件名
  17. 常用的RGB值和颜色对照表
  18. YOLOV7分割新手WIN10踩坑过程
  19. C1能力认证训练题解析 _ 第二部分 _ Web基础
  20. Typora Emoji图标

热门文章

  1. Three特效-道路流光特效
  2. 大白话之辩论DDD,阿里面试中台化理解
  3. 深度剖析原理!宅家36天咸鱼翻身入职腾讯,分享PDF高清版
  4. 矩阵分解 (加法篇)
  5. JAVA程序设计:IPO(LeetCode:502)
  6. 【毕业设计】 python flas疫情爬虫可视化
  7. [网址]Flotherm使用过程中的问题及解决方案
  8. 数学建模经验分享,matlab
  9. TCP FACK 与 RACK
  10. 计算机工考技师人机都考什么,必看|什么是人机对话考试!