前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MyCat教程【全局序列号-全局主键自增长】

MyCat教程【全局序列号-全局主键自增长】

作者头像
用户4919348
发布2019-10-17 16:51:23
1.5K0
发布2019-10-17 16:51:23
举报
文章被收录于专栏:波波烤鸭波波烤鸭

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://cloud.tencent.com/developer/article/1522714

前面我们介绍了MyCat的分库分表操作,那么同一张表中的数据会被保存在不同的数据库中,那么这就涉及到了主键维护的问题,此时肯定不能使用单个数据库中id自增的方式来处理了,这时我们就可以通过MyCat中提供的几种增长的方式来实现

全局主键自增

一、本地文件自增方式

  首先我们来看下第一种方式,也就是本地文件自增方式

1. 修改分片策略

  我们原来配置的分片策略crc32slot是不支持主键自增的,所以我们需要修改为auto-sharding-long

2. 修改server.xml文件

  server.xml文件中的sequnceHandlerType是用来配置主键生成类型的

sequnceHandlerType值

说明

0

本地文件自增方式

1

数据库自增方式

2

本地时间戳自增方式

所以我们需要先把sequnceHandlerType的值修改为0

3.sequence_conf.properties介绍

  在conf目录下的sequence_conf.properties 中有序列的相关配置信息

代码语言:javascript
复制
#Wed Oct 16 07:40:44 CST 2019
COMPANY.MAXID=2000
GLOBAL.MAXID=20000
COMPANY.HISIDS=
CUSTOMER.MAXID=2000
HOTNEWS.CURID=1000
ORDER.MINID=1001
CUSTOMER.HISIDS=
HOTNEWS.MINID=1001
GLOBAL.CURID=10002
ORDER.MAXID=2000
COMPANY.CURID=1000
CUSTOMER.CURID=1000
COMPANY.MINID=1001
GLOBAL.MINID=10001
HOTNEWS.MAXID=2000
CUSTOMER.MINID=1001
GLOBAL.HISIDS=
HOTNEWS.HISIDS=
ORDER.HISIDS=
ORDER.CURID=1000

主要的是GLOBAL.MAXID=20000 GLOBAL.CURID=10002 GLOBAL.MINID=10001 可以自行设置

4.测试实现

插入语句中主键字段用next value for MYCATSEQ_GLOBAL 替代

代码语言:javascript
复制
 insert into t_user(id,name,age)values(next value for MYCATSEQ_GLOBAL,'波波烤鸭5',23)

二、本地时间戳自增方式

&esmp; 使用时间戳的方式,我们不需要分配策略或者选择其他的分片策略。

1.修改server.xml文件

  将server.xml文件中的sequnceHandlerType修改为2

2.重启mycat

  修改了配置文件,要让其生效需重启服务。

3.插入数据测试

代码语言:javascript
复制
 insert into t_user(id,name,age)values(next value for MYCATSEQ_GLOBAL,'波波烤鸭5',23)

时间戳太长将id修改为 varchar类型。

生成成功~

三、数据库自增方式

1.创建序列表和相关函数

  第三种方式是在Mycat所管理的某个数据库中创建一张自增的表结构来维护相关的数据,相关的脚本官方提供的有,如下:

代码语言:javascript
复制
DROP TABLE IF EXISTS MYCAT_SEQUENCE;
CREATE TABLE MYCAT_SEQUENCE (
NAME VARCHAR (50) NOT NULL,
current_value INT NOT NULL,
increment INT NOT NULL DEFAULT 100,
PRIMARY KEY (NAME)
) ENGINE = INNODB ;


INSERT INTO MYCAT_SEQUENCE(NAME,current_value,increment) VALUES ('GLOBAL', 100000, 100);

DROP FUNCTION IF EXISTS `mycat_seq_currval`;
DELIMITER ;;
CREATE FUNCTION `mycat_seq_currval`(seq_name VARCHAR(50)) 
RETURNS VARCHAR(64) CHARSET utf8
    DETERMINISTIC
BEGIN DECLARE retval VARCHAR(64);
        SET retval="-999999999,null";  
        SELECT CONCAT(CAST(current_value AS CHAR),",",CAST(increment AS CHAR) ) INTO retval 
          FROM MYCAT_SEQUENCE WHERE NAME = seq_name;  
        RETURN retval ; 
END
;;
DELIMITER ;

DROP FUNCTION IF EXISTS `mycat_seq_nextval`;
DELIMITER ;;
CREATE FUNCTION `mycat_seq_nextval`(seq_name VARCHAR(50)) RETURNS VARCHAR(64)
 CHARSET utf8
    DETERMINISTIC
BEGIN UPDATE MYCAT_SEQUENCE  
                 SET current_value = current_value + increment 
                  WHERE NAME = seq_name;  
         RETURN mycat_seq_currval(seq_name);  
END
;;
DELIMITER ;


DROP FUNCTION IF EXISTS `mycat_seq_setval`;
DELIMITER ;;
CREATE FUNCTION `mycat_seq_setval`(seq_name VARCHAR(50), VALUE INTEGER) 
RETURNS VARCHAR(64) CHARSET utf8
    DETERMINISTIC
BEGIN UPDATE MYCAT_SEQUENCE  
                   SET current_value = VALUE  
                   WHERE NAME = seq_name;  
         RETURN mycat_seq_currval(seq_name);  
END
;;
DELIMITER ;

我们把这些脚本在demo2上执行

2.修改server.xml

3.修改sequence_db_conf.properties文件

  因为demo2对应的逻辑库是 dn2所以我们需要修改此处

4.测试

  重启服务并插入数据测试

代码语言:javascript
复制
 insert into t_user(id,name,age)values(next value for MYCATSEQ_GLOBAL,'波波烤鸭5',23)

主键的生成成功,除了这三种方式以外还可以通过zookeeper来维护自增的主键,这个可以自行实现

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-10-16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 全局主键自增
    • 一、本地文件自增方式
      • 1. 修改分片策略
        • 2. 修改server.xml文件
          • 3.sequence_conf.properties介绍
            • 4.测试实现
          • 二、本地时间戳自增方式
            • 1.修改server.xml文件
            • 2.重启mycat
            • 3.插入数据测试
          • 三、数据库自增方式
            • 1.创建序列表和相关函数
            • 2.修改server.xml
            • 3.修改sequence_db_conf.properties文件
            • 4.测试
        相关产品与服务
        数据库
        云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档