当前位置: 移动技术网 > IT编程>数据库>Mysql > 使用MySQL的LAST_INSERT_ID来确定各分表的唯一ID值

使用MySQL的LAST_INSERT_ID来确定各分表的唯一ID值

2017年12月12日  | 移动技术网IT编程  | 我要评论
分表除了表名的索引不同之外,表结构都是一样的,如果各表的‘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';

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网