mycat使用全局自增id數據庫方式

1.創建Mycat生成唯一主鍵所需要的函數,放在一臺mysql上即可,最好是放在mycat本機的mysql上

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 ;

#查詢test張表裏面的數據

select mycat_seq_nextval(test');

返回如下結果則正常
在這裏插入圖片描述
2.插入要自增的表名稱到MYCAT_SEQUENC表

插入數據的時候,一定要注意,自己需要插入的表,一定要是大寫的,和後面mycat中的配置保持一致

#設定ITEM表的增長方式爲 步進爲2 ,
insert into MYCAT_SEQUENCE (name,current_value,increment) values ('ITEM',0,2);
#查詢結果
 select * from MYCAT_SEQUENCE;

在這裏插入圖片描述

3.接下來配置mycat,
配置schemal.xml
table 增加屬性 autoIncrement=“true”

配置server.xml

需要修改sequnceHandlerType 爲1,

<property name="sequnceHandlerType">1</property>

配置mycat/conf/sequence_db_conf.properties

#添加需要自增長的表名稱
ITEM=node1

ITEM爲數據庫添加的表名,大寫。node1是schemal.xml中的node節點名稱,注意保持一致。

重啓mycat即可。
連接上mycat :

insert into item(value,indate)values(10,'2020-3-14 12:12:12');

注意如果日期字段插入mysql函數now()是會報錯的。
測試成功!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章