使用MySQL的LAST_INSERT_ID来确定各分表的唯一ID值
2011-08-14 22:57
766 查看
分表除了表名的索引不同之外,表结构都是一样的,如果各表的‘ID'字段仍采用‘AUTO_INCREMENT'的方式的话,ID就不能唯确定一条记录了。
这时就需要一种处于各个分表之外的机制来生成ID,我们一般采用一张单独的数据表(不妨假设表名为‘ticket_mutex')来保存这个ID,无论哪个分表有数据增加时,都是先到ticket_mutex表把ID值加1,然后取得ID值。
这个取ID的操作看似很复杂,所幸的是,MySQL提供了LAST_INSERT_ID机制,让我们能一步完成。
1、新建数据表ticket_mutex
复制代码 代码如下:
CREATE TABLE ticket_mutex (
name varchar(32) NOT NULL PRIMARY KEY COMMENT '业务名称',
value bigint(20) UNSIGNED NOT NULL COMMENT 'ID值'
)Engine=InnoDB DEFAULT CHARSET=UTF8 COMMENT '保存分表ID表';
字段‘name'用来说明这个ID是哪个业务的,比如‘用户'的ID,我们可以定为‘USER';
字段‘value'即该业务的ID值。
2、初始化业务和其ID值
复制代码 代码如下:
INSERT INTO ticket_mutex(name, value) values('USER', 0),('POST', 0);
+------+-------+
| name | value |
+------+-------+
| POST | 0 |
| USER | 0 |
+------+-------+
我们初始化了2条记录,即有2个不同的业务,分别代表‘用户信息'和‘主题信息',它们初始ID值均为‘0';
3、获取分表唯一ID
这个时候就要利用MySQL提供的LAST_INSERT_ID()机制了。
在往用户表里新增一条数据时,获取‘用户ID':
复制代码 代码如下:
UPDATE ticket_mutex SET value=LAST_INSERT_ID(value+1) WHERE name='USER';SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
| 1 |
+------------------+
通过这条语句之后,我们得到结果为1,这个值就是我们所需要的值。再来查看数据记录,我们发现记录总数没有改变,但是‘用户'的ID已经为1了;
复制代码 代码如下:
+------+-------+
| name | value |
+------+-------+
| POST | 0 |
| USER | 1 |
+------+-------+
查看所有的记录:
复制代码 代码如下:
+------+-------+
| name | value |
+------+-------+
| POST | 1 |
| USER | 1 |
+------+-------+
从上可以看出,通过MySQL的LAST_INSERT_ID机制,我们可以保证在记录总数不增长的情况下,让业务ID在不断的增加,从而保证了分表ID的唯一性。
4、LAST_INSERT_ID说明
从名字可以看出,LAST_INSERT_ID即为最后插入的ID值,根据MySQL的官方手册说明,它有2种使用方法
一是不带参数:LAST_INSERT_ID(),这种方法和AUTO_INCREMENT属性一起使用,当往带有‘AUTO_INCREMENT'属性字段的表中新增记录时,LAST_INSERT_ID()即返回该字段的值,大家可试下(我已经验证过);
二是带有表达式:如上面介绍的LAST_INSERT_ID(value+1),它返回的是表达式的值,即‘value+1';
这时就需要一种处于各个分表之外的机制来生成ID,我们一般采用一张单独的数据表(不妨假设表名为‘ticket_mutex')来保存这个ID,无论哪个分表有数据增加时,都是先到ticket_mutex表把ID值加1,然后取得ID值。
这个取ID的操作看似很复杂,所幸的是,MySQL提供了LAST_INSERT_ID机制,让我们能一步完成。
1、新建数据表ticket_mutex
复制代码 代码如下:
CREATE TABLE ticket_mutex (
name varchar(32) NOT NULL PRIMARY KEY COMMENT '业务名称',
value bigint(20) UNSIGNED NOT NULL COMMENT 'ID值'
)Engine=InnoDB DEFAULT CHARSET=UTF8 COMMENT '保存分表ID表';
字段‘name'用来说明这个ID是哪个业务的,比如‘用户'的ID,我们可以定为‘USER';
字段‘value'即该业务的ID值。
2、初始化业务和其ID值
复制代码 代码如下:
INSERT INTO ticket_mutex(name, value) values('USER', 0),('POST', 0);
+------+-------+
| name | value |
+------+-------+
| POST | 0 |
| USER | 0 |
+------+-------+
我们初始化了2条记录,即有2个不同的业务,分别代表‘用户信息'和‘主题信息',它们初始ID值均为‘0';
3、获取分表唯一ID
这个时候就要利用MySQL提供的LAST_INSERT_ID()机制了。
在往用户表里新增一条数据时,获取‘用户ID':
复制代码 代码如下:
UPDATE ticket_mutex SET value=LAST_INSERT_ID(value+1) WHERE name='USER';SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
| 1 |
+------------------+
通过这条语句之后,我们得到结果为1,这个值就是我们所需要的值。再来查看数据记录,我们发现记录总数没有改变,但是‘用户'的ID已经为1了;
复制代码 代码如下:
+------+-------+
| name | value |
+------+-------+
| POST | 0 |
| USER | 1 |
+------+-------+
查看所有的记录:
复制代码 代码如下:
+------+-------+
| name | value |
+------+-------+
| POST | 1 |
| USER | 1 |
+------+-------+
从上可以看出,通过MySQL的LAST_INSERT_ID机制,我们可以保证在记录总数不增长的情况下,让业务ID在不断的增加,从而保证了分表ID的唯一性。
4、LAST_INSERT_ID说明
从名字可以看出,LAST_INSERT_ID即为最后插入的ID值,根据MySQL的官方手册说明,它有2种使用方法
一是不带参数:LAST_INSERT_ID(),这种方法和AUTO_INCREMENT属性一起使用,当往带有‘AUTO_INCREMENT'属性字段的表中新增记录时,LAST_INSERT_ID()即返回该字段的值,大家可试下(我已经验证过);
二是带有表达式:如上面介绍的LAST_INSERT_ID(value+1),它返回的是表达式的值,即‘value+1';
您可能感兴趣的文章:
- mysql数据库分表分库的策略
- MySQL 5.7双主同步部分表的实现过程详解
- MyBatis实现Mysql数据库分库分表操作和总结(推荐)
- 什么是分表和分区 MySql数据库分区和分表方法
- Mysql数据库性能优化三(分表、增量备份、还原)
- MYSQL数据库数据拆分之分库分表总结
- MySQL分表自增ID问题的解决方法
- PHP操作mysql数据库分表的方法
- Mysql数据库分库和分表方式(常用)
- 1亿条数据如何分表100张到Mysql数据库中(PHP)
- php实现mysql数据库分表分段备份
- mysql分表和分区的区别浅析
- mysql的3种分表方案
- MySQL分表实现上百万上千万记录分布存储的批量查询设计模式详解
- MYSQL性能优化分享(分库分表)
- MySQL动态创建表,数据分表的存储过程
- MySQL 分表优化试验代码
- mysql分表分库的应用场景和设计方式
相关文章推荐
- 使用MySQL的LAST_INSERT_ID来确定各分表的唯一ID值
- 使用MySQL的LAST_INSERT_ID来确定各分表的唯一ID值
- MySQL使用LAST_INSERT_ID()获取新插入记录的ID
- Mysql中last_insert_id()函数使用的注意事项
- MySQL-LAST_INSERT_ID();使用注意事项
- Mysql中LAST_INSERT_ID()的函数使用详解
- 使用MySQL的LAST_INSERT_ID
- 关于Mysql LAST_INSERT_ID()使用
- mysql LAST_INSERT_ID 使用与注意事项
- MySQL学习笔记(四):MySQL中LAST_INSERT_ID()使用时的注意事项
- Mysql多线程、多用户同时操作数据库获取当前用户操作的最新主键值(获取使用MySQL的LAST_INSERT_ID)
- 使用MySQL的LAST_INSERT_ID
- MYSQL学习心得(2) --使用MySQL的LAST_INSERT_ID
- Mysql中LAST_INSERT_ID()的函数使用详解
- 【MySQL笔记】last_insert_id()函数使用的注意事项
- asp.net调用mysql 存储过程 带 out 返回值,返回刚插入数据库中的自增的ID,LAST_INSERT_ID() 的使用
- asp.net调用mysql 存储过程 带 out 返回值,返回刚插入数据库中的自增的ID,LAST_INSERT_ID() 的使用
- mysql LAST_INSERT_ID 使用与注意事项
- 使用MySQL的LAST_INSERT_ID--转
- Mysql中LAST_INSERT_ID()的函数使用详解