赞
踩
前面我们介绍了MyCat的分库分表操作,那么同一张表中的数据会被保存在不同的数据库中,那么这就涉及到了主键
维护的问题,此时肯定不能使用单个数据库中id自增的方式来处理了,这时我们就可以通过MyCat中提供的几种增长的方式来实现
首先我们来看下第一种方式,也就是本地文件自增
方式
我们原来配置的分片策略crc32slot
是不支持主键自增的,所以我们需要修改为auto-sharding-long
server.xml文件中的sequnceHandlerType
是用来配置主键生成类型的
sequnceHandlerType值 | 说明 |
---|---|
0 | 本地文件自增方式 |
1 | 数据库自增方式 |
2 | 本地时间戳自增方式 |
所以我们需要先把sequnceHandlerType的值修改为0
在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
可以自行设置
插入语句中主键字段用next value for MYCATSEQ_GLOBAL
替代
insert into t_user(id,name,age)values(next value for MYCATSEQ_GLOBAL,'波波烤鸭5',23)
&esmp; 使用时间戳的方式,我们不需要分配策略或者选择其他的分片策略。
将server.xml文件中的sequnceHandlerType
修改为2
修改了配置文件,要让其生效需重启服务。
insert into t_user(id,name,age)values(next value for MYCATSEQ_GLOBAL,'波波烤鸭5',23)
时间戳太长将id
修改为 varchar
类型。
生成成功~
第三种方式是在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
上执行
因为demo2
对应的逻辑库是 dn2
所以我们需要修改此处
重启服务并插入数据测试
insert into t_user(id,name,age)values(next value for MYCATSEQ_GLOBAL,'波波烤鸭5',23)
主键的生成成功,除了这三种方式以外还可以通过`zookeeper`来维护自增的主键,这个可以自行实现
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。