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

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

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


全局主键自增


一、本地文件自增方式


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


1. 修改分片策略


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


20191016191756909.png


2. 修改server.xml文件


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

sequnceHandlerType值 说明
0 本地文件自增方式
1 数据库自增方式
2 本地时间戳自增方式


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


20191016191610132.png


3.sequence_conf.properties介绍


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

#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 替代

 insert into t_user(id,name,age)values(next value for MYCATSEQ_GLOBAL,'波波烤鸭5',23)

2019101619224494.gif


二、本地时间戳自增方式


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


20191016193511519.png20191016193613521.png




1.修改server.xml文件


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


20191016192428580.png


2.重启mycat


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


20191016192453406.png


3.插入数据测试

 insert into t_user(id,name,age)values(next value for MYCATSEQ_GLOBAL,'波波烤鸭5',23)


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


20191016192752602.png20191016193756835.png



生成成功~


三、数据库自增方式


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


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

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上执行


20191016194426512.png


2.修改server.xml


20191016194602365.png


3.修改sequence_db_conf.properties文件


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


20191016194635845.png


4.测试


 重启服务并插入数据测试


20191016194740690.png

 insert into t_user(id,name,age)values(next value for MYCATSEQ_GLOBAL,'波波烤鸭5',23)

201910161949171.gif


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


相关文章
|
4月前
|
监控 数据库
在Seata中一张表使用了联合主键,在事务回滚时报异常,改为单个主键,就没有这个异常,如何解决?
在Seata中一张表使用了联合主键,在事务回滚时报异常,改为单个主键,就没有这个异常,如何解决?
|
11月前
|
数据库
25MyCat - 全局序列号(其它方式)
25MyCat - 全局序列号(其它方式)
28 1
|
11月前
|
存储 算法 安全
场景应用:id全局唯一且自增,如何实现?
场景应用:id全局唯一且自增,如何实现?
166 0
为什么要设置主键?
为什么要设置主键?
63 0
|
算法 Scala 数据库
4. 分库分表之后, id 主键如何处理?
4. 分库分表之后, id 主键如何处理?
107 0
4. 分库分表之后, id 主键如何处理?
|
关系型数据库 MySQL
MyCat:第六章:MyCAT自增字段和返回生成的主键ID的经验分享
MyCat:第六章:MyCAT自增字段和返回生成的主键ID的经验分享
105 0
|
SQL 数据库
数据库原理与应用(SQL Server)教程 主键、外键以及联合主键、复合主键和设置种子数目和增量
数据库原理与应用(SQL Server)教程 主键、外键以及联合主键、复合主键和设置种子数目和增量
数据库原理与应用(SQL Server)教程 主键、外键以及联合主键、复合主键和设置种子数目和增量
|
关系型数据库 Java 数据库
使用jpa在postgresql数据库中创建主键自增表
jpa依赖 org.springframework.boot spring-boot-starter-data-jpa org.
3362 0
|
存储 SQL 关系型数据库
MySQL 建表为啥设置自增 id?用流水号当主键不正好么?
本文主要通过查阅资料,了解为什么要设置一个和业务无关的自增 id 用来当做主键,很多内容比较浅显,比如 InnoDB 的 B+ 树,页分裂及页合并,插入过程等都没有进行深入研究,有兴趣的小伙伴可以更深入的研究下。 同时在建表时除了要设置一个自增 id 用来当做主键,小伙伴们在业务开发过程中是否也会遇到一种情况:用户的注销,数据的删除等都是进行的逻辑删除,而不是物理删除。 本篇文章介绍比较简陋,不足之处,希望大家多多指正。
642 0