设置Mycat主键自增且唯一(数据库方法)
本文仅考虑使用数据库方式进行主键自增
1、配置server.xml
# 其中1,表示使用数据库方式,0为使用本地文件方式,2为使用时间戳形式。
<system>
<property name="sequnceHandlerType">1</property>
</system>
2、配置schema.xml并在某个分节点中建立表和存储过程
2.1
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="test_all" checkSQLschema="false" sqlMaxLimit="200" dataNode="t1">
<table name="cable_temperature_monitor_data" primaryKey="id" autoIncrement="true" dataNode="t1,t2" rule="sharding-by-date"/>
</schema>
<dataNode name="t1" dataHost="mysql1" database="test1" />
<dataNode name="t2" dataHost="mysql1" database="test2" />
......省略
</mycat:schema>
2.2 建立表和存储过程
需要登录到真实数据库中进行创建,而不是在mycat中
(我这里在test1数据库中建立)
建立表
-- 创建MYCAT_SEQUENCE表
CREATE TABLE MYCAT_SEQUENCE ( `name` VARCHAR(50) NOT NULL, current_value INT NOT NULL, increment INT NOT NULL DEFAULT 1, 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 ;
2.3 插入记录
关键!!
-- 插入sequence记录,这里插入的是需要进行自增操作的表,必须大写!!!必须大写!!必须大写!
INSERT INTO MYCAT_SEQUENCE(name,current_value,increment) VALUES ('CABLE_TEMPERATURE_MONITOR_DATA', 0, 1);
INSERT INTO MYCAT_SEQUENCE(name,current_value,increment) VALUES ('GLOBAL', 1, 100);
-- 代表插入了一个名为mycat的sequence,当前值为1,步长为100。
3、设置 sequence_db_conf.properties文件
位置与server.xml、schema.xml等文件同一目录下
#sequence stored in datanode
GLOBAL=t1
CABLE_TEMPERATURE_MONITOR_DATA=t1
# 前者为你需要自增的表(与之前添加数据同名),后者为建立MYCAT_SEQUENCE表的真实数据库
4、重启mycat或刷新mycat配置文件
重启略。。。
刷新配置
# 9066为mycat管理端口
mysql -u root -p -P 9066 -h 127.0.0.1
mysql> reload @@config;
5、报错
检查配置文件,主要检查sequence_db_conf.properties