例子接上文:https://www.jianshu.com/p/adba8875d1c9
![](https://img.haomeiwen.com/i7393203/6bd13944419e603a.png)
![](https://img.haomeiwen.com/i7393203/ea8ef76865273320.png)
如上,mycat已经配置好了。
在实现分库分表的情况下,数据库自增主键已无法保证自增主键的全局唯一。为此,MyCat 提供了全局
sequence,并且提供了包含本地配置和数据库配置等多种实现方式。
数据库配置
在db1的真实数据库中,创建一个表:
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 ;
测试一下:
![](https://img.haomeiwen.com/i7393203/ff93a63b30697d10.png)
![](https://img.haomeiwen.com/i7393203/b3b6a348b5d58639.png)
测试方法是否添加成功,如图,测试成功。
设定CUSTOMER表的增长方式
CUSTOMER要大写
insert into MYCAT_SEQUENCE (name,current_value,increment) values ('CUSTOMER',0,1);
-
配置schema.xml
5.png
如图,
customer表:主键是ID,autoIncrement="true"表示这个表的主键是自增长的,是逻辑表的主键自增长,dataNode是分片节点,rule是分片规则。
mycat_sequence表:主键是name,dataNode是在其中一个分片节点下。
-
配置rule.xml
6.png
-
配置server.xml
![](https://img.haomeiwen.com/i7393203/29ee22959f0baaff.png)
如图,sequncehandlerType设为1;
0 表示是表示使用本地文件方式
1 表示的是根据数据库来生成,就是我们自己配置的自增长
2 表示时间戳的方式
-
配置自增长主键
在下图的位置中的sequence_db_conf.properties文件中添加CUSTOMER=dn1,指定在哪个分片。
5.png
-
测试
8.png
![](https://img.haomeiwen.com/i7393203/f7d576122784b008.png)
![](https://img.haomeiwen.com/i7393203/eb2f1447b543f6ff.png)
可以看出,插入的数据均匀分配到不同的分片,并且保证了主键id的唯一。
![](https://img.haomeiwen.com/i7393203/18aefe9f0b51c17e.png)
再看mycat_sequence表,因为刚刚插入了6条数据,所以现在的current_value字段的值为6。
网友评论