转载自:https://www.cnblogs.com/raphael5200/p/5900007.html
以下只记录步骤,方便以后查看。
数据库方式:
1.修改mycat目录下conf目录中的server.xml文件
# 其中1,表示使用数据库方式。
<system>
<property name="sequnceHandlerType">1</property>
</system>
2.在其中一个数据节点(dataHost)中创建相应的表和存储过程
注意:是登录到mysql数据库中执行,而不是在mycat中
可以在linux系统中的mysql的bin目录下启动数据库后执行
./mysql -u root -p
也可以通过Navicat工具在对应的数据库中执行
-- 创建MYCAT_SEQUENCE表
CREATE TABLE MYCAT_SEQUENCE (
`name` VARCHAR(50) NOT NULL,
current_value INT NOT NULL,
increment INT NOT NULL DEFAULT 1,
remark varchar(100), -- remark 并不是必须的,在这里我是为了让每一个表都对应一个全局的自增,在Remark中配置自增项对应的表名。方便后期维护
PRIMARY KEY(name)) ENGINE=InnoDB;
-- – 获取当前sequence的值(返回当前值,增量)
DROP FUNCTION IF EXISTS `mycat_seq_currval`;
DELIMITER ;;
CREATE DEFINER=`root`@`%` FUNCTION `mycat_seq_currval`(seq_name VARCHAR(50)) RETURNS varchar(64) CHARSET latin1
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 ;
-- 设置sequence值
DROP FUNCTION IF EXISTS `mycat_seq_nextval`;
DELIMITER ;;
CREATE DEFINER=`root`@`%` FUNCTION `mycat_seq_nextval`(seq_name VARCHAR(50)) RETURNS varchar(64) CHARSET latin1
DETERMINISTIC
BEGIN
UPDATE MYCAT_SEQUENCE
SET current_value = current_value + increment WHERE name = seq_name;
RETURN mycat_seq_currval(seq_name);
END
;;
DELIMITER ;
-- 获取下一个sequence值
DROP FUNCTION IF EXISTS `mycat_seq_setval`;
DELIMITER ;;
CREATE DEFINER=`root`@`%` FUNCTION `mycat_seq_setval`(seq_name VARCHAR(50), value INTEGER) RETURNS varchar(64) CHARSET latin1
DETERMINISTIC
BEGIN
UPDATE MYCAT_SEQUENCE
SET current_value = value
WHERE name = seq_name;
RETURN mycat_seq_currval(seq_name);
END
;;
DELIMITER ;
3.向表中插入数据
-- 插入sequence记录
INSERT INTO MYCAT_SEQUENCE(name,current_value,increment,remark) VALUES ('DICT', 1, 100,'match:tb_dic');
INSERT INTO MYCAT_SEQUENCE(name,current_value,increment,remark) VALUES ('GLOBAL', 1, 100,'GLOBAL');
-- 代表插入了一个名为mycat的sequence,当前值为1,步长为100。
其中curret_value为自增列的当前值,第一次可以可以理解为初始值,increment为每次增加的大小
前两条我没搞懂有啥用,然后添加自己的表数据,如我有一个mycat_book表,则需要在表中添加:
INSERT INTO MYCAT_SEQUENCE(name,current_value,increment,remark) VALUES ('MYCAT_BOOK', 1, 1,'MYCAT_BOOK');
--name:需要调用自增的主键的列 current_value:自增主键当前值 increment:每次增加的值
4、设置 sequence_db_conf.properties文件
该文件在linux系统中mycat目录下conf目录中
vim sequence_db_conf.properties
修改内容为:
#sequence stored in datanode
GLOBAL=dn1
COMPANY=dn1
CUSTOMER=dn1
ORDERS=dn1
DICT=dn1 #创建的表中缺少的字段
MYCAT_BOOK=dn1 #自己的表名(大写)= dataHost名称
5、设置schema.xml文件
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<table name="mycat_book" primaryKey="id" autoIncrement="true"
dataNode="dn1" rule="mod-long" />
</schema>
#主要是添加自增属性 autoIncrement 和 primaryKey
到此为止就算配置完了,向mycat中映射的虚拟表添加数据就会生成对应的自增主键了,必须是MYCAT_SEQUENCE 表中配置过的表,sequence_db_conf.properties文件中也得对应