MyCat教程六:全局序列号-全局主键的自增长

匿名 (未验证) 提交于 2019-12-02 22:06:11

主键维护的问题,此时肯定不能使用单个数据库中id自增的方式来处理了,这时我们就可以通过MyCat中提供的几种增长的方式来实现

全局主键自增

一、本地文件自增方式

本地文件自增方式

1. 修改分片策略

crc32slot是不支持主键自增的,所以我们需要修改为auto-sharding-long

2. 修改server.xml文件

sequnceHandlerType是用来配置主键生成类型的

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

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

3.sequence_conf.properties介绍

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,'HG-93',23) 

二、本地时间戳自增方式

1.修改server.xml文件

sequnceHandlerType修改为2

2.重启mycat

3.插入数据测试

 insert into t_user(id,name,age)values(next value for MYCATSEQ_GLOBAL,'HG-93',23) 

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


生成成功~

三、数据库自增方式

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

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.测试

 insert into t_user(id,name,age)values(next value for MYCATSEQ_GLOBAL,'hg-93',23) 

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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!