設定Mycat主鍵自增且唯一(非本地檔案OR時間戳方式)
阿新 • • 發佈:2020-12-17
設定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