`

MySQL AUTO_INCREMENT 要点记录

    博客分类:
  • DB
阅读更多

参考:

[MySQL Cookbook(Edition 2)] Chaper 11 Generating and Using Sequences

[MySQL 5.1  参考手册]

google

 

1. AUTO_INCREMENT 列定义

1) 语法:

CREATE TABLE xxx

(

...

id INT UNSIGNED NOT NULL AUTO_INCREMENT,

PRIMARY KEY (id)

or

UNIQUE (id)

...

)

 

SERIALBIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE的一个别名。

在整数列定义中,SERIAL DEFAULT VALUENOT NULL AUTO_INCREMENT UNIQUE的一个别名。

 

2) 能定义为AUTO_INCREMENT的列类型:整数类型。

3) UNSIGNED作用:将序列的取值范围增加一倍,

如TINYINT取值范围为-128~127,未指定UNSIGNED序列值为1~127,指定后则序列值为1~255。

4) AUTO_INCREMENT列必须被索引化。

5) MyISAM是支持含有AUTO_INCREMENT列的表的最佳引擎。

 

2. AUTO_INCREMENT 列值

1) 最大值取决于它所使用的整数类型。

2) 序列值的重用(含AUTO_INCREMENT 列的表数据被删除后所产生的场景):

a) 空洞值(如表中已有记录1,2,3,4,5, 删除了2, 则形成了2这个空洞值):无论何种表引擎,均不会重用。

b) 顶端值(如表中已有记录1,2,3,4,5, 则5是顶端值,然后删除了5):BDB会重用(下一个序列值为5),MyISAM、InnoDB不会重用(下一个序列值为6)。

 

3) 序列值的查询:

a) 通过数据库函数: LAST_INSERT_ID() 这个返回值基于服务器的每一个客户端连接。

b) 通过JDBC API: Java: getLastInsertID() 方法:

long seq = ((com.mysql.jdbc.Statement) s).getLastInsertID();

or

long seq = ((com.mysql.jdbc.PreparedStatement) s).getLastInsertID(); 

注意事项:

a) 生成和获取AUTO_INCREMENT操作在同一个MySQL连接内,否则将会得到0。

b) 客户端序列值的有效性与每一条语句相关,而不仅仅由生成AUTO_INCREMENT值的语句决定。

使用如下原则可以避免错误:当生成一个不会马上使用的序列值,可以先保存到一个变量中。

4) 序列值的范围扩展:

a) 如果列值类型是有符号的,改为UNSIGNED。

b) 如果已经是UNSIGNED并不是最大的整数类型(BIGINT),则变更列类型为最大的整数类型。

5) 序列值的重建:

从表中删除这一列,然后再添加回去,MySQL会将列值重新序列化为一个连续序列。

 

6) 指定步长、偏移量:

a) 全局配置方式:

在 my.ini 中增加以下配置项:

auto_increment_increment=n

auto_increment_offset=x

 

Replication时,为防止auto_increment列值重复 ,则是在 my.cnf 中增加以上2个配置项:

如在A服务器的my.cnf设置如下: 
auto_increment_offset = 1 
auto_increment_increment = 2 
则A的auto_increment字段产生的数值是:1, 3, 5, 7, ... 

在B服务器的my.cnf设置如下: 
auto_increment_offset = 2 
auto_increment_increment = 2 
则B的auto_increment字段产生的数值是:2, 4, 6, 8, ... 

b) 针对某表:

CREATE TABLE 加上 AUTO_INCREMENT=n  

or

ALTER TABLE  AUTO_INCREMENT=n  

如果表是非MyISAM或InnoDB引擎,则可以这样:

插入具有序列值n-1的“假”行,然后在插入了一行或多行“真”数据后删除这个“假”行。

 

3. AUTO_INCREMENT 其他应用场景:
1) 复合主键:

昆虫采集表:

CREATE TABLE bug
(
  id      INT UNSIGNED NOT NULL AUTO_INCREMENT,
  name    VARCHAR(30) NOT NULL, # type of bug
  date    DATE NOT NULL,        # date collected
  origin  VARCHAR(30) NOT NULL, # where collected
  PRIMARY KEY (name, id)
);

插入一些数据,然后使用 order by 查询表中数据,可以看到MySQL为每一个唯一的name值创建了一个独立的序列:

 

mysql> SELECT * FROM bug ORDER BY name, id;
+----+-----------+------------+-------------------+
| id | name      | date       | origin            |
+----+-----------+------------+-------------------+
|  1 | ant       | 2006-10-07 | kitchen           |
|  2 | ant       | 2006-10-07 | front yard        |
|  3 | ant       | 2006-10-07 | front yard        |
|  4 | ant       | 2006-10-11 | garden            |
|  1 | beetle    | 2006-10-07 | basement          |
|  2 | beetle    | 2006-10-08 | front yard        |
|  1 | cricket   | 2006-10-08 | garage            |
|  2 | cricket   | 2006-10-10 | basement          |
|  3 | cricket   | 2006-10-11 | garden            |
|  1 | honeybee  | 2006-10-08 | back yard         |
|  2 | honeybee  | 2006-10-11 | garden            |
|  1 | millipede | 2006-10-07 | basement          |
|  1 | termite   | 2006-10-09 | kitchen woodwork  |
|  2 | termite   | 2006-10-11 | bathroom woodwork |
+----+-----------+------------+-------------------+

 

 

2) 计数器:
采用一个计数器占用一行的序列生成机制。

 

INSERT语句中加上 ON DUPLICATE KEY UPDATE

例:

INSERT INTO tbl (col, num) VALUES('test', LAST_INSERT_ID(n))

ON DUPLICATE KEY UPDATE num = LAST_INSERT_ID(num+n);


3) 循环序列:

使用 division 和 modulo 操作符生成循环元素。

业务场景:

假设你正在生产药品或汽车零件,你必须通过批号跟踪所有商品,如果以后发现了产品问题,要求召回售出的某一批产品。假设你把12个产品包装为1盒,6盒包装为1箱。

这种情况下,产品编号为3个部分:单品编号(1到12)、盒编号(1到6)、1个批号(从1到任意值)。

根据序列编号生成箱、盒和单品编号的公式如下:

unit_num = ((seq - 1) % 12) + 1

box_num = (int ((seq - 1) / 12) % 6) + 1

case_num = int ((seq - 1)/(6 * 12)) + 1

下表说明了序列值与对应的箱、盒、单品编号之间的关系:

 

seq case box unit
1 1 1 1
12 1 1 12
13 1 2 1
72 1 6 12
73 2 1 1
144 2 6 12

 

 

4. Oracle MySQL 的 sequence 和 AUTO_INCREMENT 互转:

MySQL---ORACLE序列解决方案

MySQL全局序列的实现方式(待实践研究):

1) sequence表:缺点:可能会成为性能瓶颈。

2) Flickr:与sequence表方式类似,但较好地解决了性能瓶颈和单点问题。

 

 

分享到:
评论

相关推荐

    mysql主主复制

    ### MySQL主主复制知识点详解 #### 一、MySQL主主复制概述 MySQL主主复制是一种高级复制模式,它允许两...以上就是MySQL主主复制的基本部署流程和技术要点,希望对你有所帮助。如在实际操作中遇到问题,请留言交流。

    Oracle到mysql转换的问题总结要点.doc

    - MySQL有`AUTO_INCREMENT`特性,而Oracle需要创建序列并手动引用。 - Oracle的`NEXTVAL`函数在MySQL中可通过自定义函数或`LAST_INSERT_ID()`实现类似功能。 4. **翻页查询**: - MySQL使用`LIMIT`关键字进行...

    mysql转换到oracle数据库

    - 移除MySQL中的`auto_increment`特性。 - 调整`NOT NULL default ''`为`default '' NOT NULL`。 - 将级联操作(`ON DELETE CASCADE ON UPDATE CASCADE`)保留。 - 移动外键定义到最后一步执行。 - **其他细节*...

    利用keepalived构建高可用的MySQL

    本文详细介绍了如何利用Keepalived构建高可用的MySQL系统,包括具体的配置步骤和技术要点。通过这种方式,可以在不增加过多复杂性的前提下,显著提高系统的稳定性和可靠性,满足企业级应用的需求。对于那些对数据...

    Mysql的核心要点

    - **自动增长**(`AUTO_INCREMENT`): 自动为新记录分配唯一的ID值。 - **注释**: 可以为表、列等添加注释信息,便于理解。 以上内容概述了MySQL的核心要点,包括基本概念、操作、优化策略、部署方案、数据类型等方面...

    PHP连接各种数据库代码.pdf

    id INT(255) UNSIGNED NOT NULL AUTO_INCREMENT, count INT(255) UNSIGNED NOT NULL DEFAULT 0, PRIMARY KEY (id) ) TYPE=InnoDB; '; mysql_query($sql_create_table); ``` #### 3. 关闭连接 - 使用 `mysql_...

    【数据面试系列】MySQL高频面试题及知识要点.pdf

    ### 数据面试系列:MySQL高频面试题及知识要点 #### 第一部分:MySQL基础知识 **1. 三大范式是什么?** 三大范式是数据库设计中为了减少数据冗余和提高数据完整性而设定的一套规则。 - **第一范式(1NF)**:确保...

    mysql5.5内附安装命令

    - 创建表:`CREATE TABLE mytable (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255));` - 插入数据:`INSERT INTO mytable (name) VALUES ('John Doe');` - 查询数据:`SELECT * FROM mytable;` 四、安全...

    MySQL数据库和表的创建与管理PPT课件.ppt

    * 创建数据库表的语法格式:CREATE TABLE 表名 (列名 数据类型 [NOT NULL] [AUTO_INCREMENT],…); * 管理数据库表的操作包括插入、删除、修改等,使用SQL语句实现。 * 使用图形界面工具创建和管理数据库表,可以...

    mysql命令大全mysql命令大全

    根据提供的文件内容,我们可以整理出一系列关于MySQL的基本命令与操作要点。MySQL是一种广泛使用的开源关系型数据库管理系统(RDBMS),适用于多种应用场景,包括网站、应用程序等的数据存储和管理。以下是从标题、...

    MySQL笔记,小赵同学整理

    6. 当需要自增字段时,可以使用AUTO_INCREMENT属性,并且可以指定一列或多列作为表的主键(PRIMARY KEY)。 7. 可以通过另一个表复制创建新表,这通常涉及到从源表选择数据并创建新表。 对于数据表的操作,笔记中也...

    一个刷卡项目建立表格说明(刷卡项目环境说明)

    `num_id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID号', `recordCard_id` varchar(100) NOT NULL COMMENT '卡号', `recordIndex_no` varchar(100) NOT NULL COMMENT '索引号', `recordDoor_no` int(10) ...

    数据库课程设计案例及数据库毕业设计实例

    UserID INT PRIMARY KEY AUTO_INCREMENT, UserName VARCHAR(50) NOT NULL, Password VARCHAR(50) NOT NULL, Email VARCHAR(100), Phone VARCHAR(15) ); ``` 2. **图书表(Book)** ```sql CREATE TABLE ...

    数据库01MySQL数据库开发基础篇-mysql数据库编程开发实训(基础篇)

    6. **主键自增**:使用`AUTO_INCREMENT`属性使主键字段自动递增。 #### 六、SQL语法规则 - **SQL语句**:可以单行或多行书写,以分号结束。 - **注释**:单行注释使用`--`或`#`,多行注释使用`/* */`。 - **大小写...

    2016全国计算机二级MYSQL考试题库(含答案)..doc

    ( sno int not null auto_increment primary key, sname char(8) not null, zhuanyeming char(10) null, sex char(1) not null, sbir date not null, photo blob null, comment text null ) engine=InnoDB; ...

    Python操作Mysql实例教程手册(带书签).pdf

    根据提供的文件内容,本文将详细介绍Python操作MySQL数据库的技术要点,包括安装MySQL模块、连接数据库、执行SQL语句、获取结果集、遍历结果集、获取特定字段、获取表的字段名、将图片数据插入数据库以及执行事务等...

    5.29作业mysql数据库+存储数据.docx

    根据给定文件的信息,我们可以提炼出...以上内容涵盖了MySQL数据库的基本概念和技术要点,包括存储引擎的选择、数据类型的使用、索引的建立以及表的约束等方面,旨在帮助读者更好地理解和掌握MySQL数据库的使用技巧。

    Jsp连接mysql数据库.pdf

    userId int AUTO_INCREMENT PRIMARY KEY, userName VARCHAR(50) NOT NULL, passwd VARCHAR(50) NOT NULL ); ``` #### 二、JDBC简介 1. **定义:** - JDBC(Java Database Connectivity)是一种用于执行SQL...

Global site tag (gtag.js) - Google Analytics