1. 程式人生 > 其它 >設定Mycat主鍵自增且唯一(非本地檔案OR時間戳方式)

設定Mycat主鍵自增且唯一(非本地檔案OR時間戳方式)

技術標籤:錯查集錦mysql資料庫mycat

設定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