前面我們介紹了MyCat的分庫分表操作,那麼同一張表中的數據會被保存在不同的資料庫中,那麼這就涉及到了主鍵維護的問題,此時肯定不能使用單個資料庫中id自增的方式來處理了,這時我們就可以通過MyCat中提供的幾種增長的方式來實現 全局主鍵自增 一、本地文件自增方式 首先我們來看下第一種方式,也就是本地 ...
前面我們介紹了MyCat的分庫分表操作,那麼同一張表中的數據會被保存在不同的資料庫中,那麼這就涉及到了主鍵
維護的問題,此時肯定不能使用單個資料庫中id自增的方式來處理了,這時我們就可以通過MyCat中提供的幾種增長的方式來實現
全局主鍵自增
一、本地文件自增方式
首先我們來看下第一種方式,也就是本地文件自增
方式
1. 修改分片策略
我們原來配置的分片策略crc32slot
是不支持主鍵自增的,所以我們需要修改為auto-sharding-long
2. 修改server.xml文件
server.xml文件中的sequnceHandlerType
是用來配置主鍵生成類型的
sequnceHandlerType值 | 說明 |
---|---|
0 | 本地文件自增方式 |
1 | 資料庫自增方式 |
2 | 本地時間戳自增方式 |
所以我們需要先把sequnceHandlerType的值修改為0
3.sequence_conf.properties介紹
在conf目錄下的sequence_conf.properties
中有序列的相關配置信息
#Wed Oct 16 07:40:44 CST 2019
COMPANY.MAXID=2000
GLOBAL.MAXID=20000
COMPANY.HISIDS=
CUSTOMER.MAXID=2000
HOTNEWS.CURID=1000
ORDER.MINID=1001
CUSTOMER.HISIDS=
HOTNEWS.MINID=1001
GLOBAL.CURID=10002
ORDER.MAXID=2000
COMPANY.CURID=1000
CUSTOMER.CURID=1000
COMPANY.MINID=1001
GLOBAL.MINID=10001
HOTNEWS.MAXID=2000
CUSTOMER.MINID=1001
GLOBAL.HISIDS=
HOTNEWS.HISIDS=
ORDER.HISIDS=
ORDER.CURID=1000
主要的是GLOBAL.MAXID=20000
GLOBAL.CURID=10002
GLOBAL.MINID=10001
可以自行設置
4.測試實現
插入語句中主鍵欄位用next value for MYCATSEQ_GLOBAL
替代
insert into t_user(id,name,age)values(next value for MYCATSEQ_GLOBAL,'HG-93',23)
二、本地時間戳自增方式
使用時間戳的方式,我們不需要分配策略或者選擇其他的分片策略。
1.修改server.xml文件
將server.xml文件中的sequnceHandlerType
修改為2
2.重啟mycat
修改了配置文件,要讓其生效需重啟服務。
3.插入數據測試
insert into t_user(id,name,age)values(next value for MYCATSEQ_GLOBAL,'HG-93',23)
時間戳太長將id
修改為 varchar
類型。
生成成功~
三、資料庫自增方式
1.創建序列表和相關函數
第三種方式是在Mycat所管理的某個資料庫中創建一張自增的表結構來維護相關的數據,相關的腳本官方提供的有,如下:
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 ;
我們把這些腳本在demo2
上執行
2.修改server.xml
3.修改sequence_db_conf.properties文件
因為demo2
對應的邏輯庫是 dn2
所以我們需要修改此處
4.測試
重啟服務並插入數據測試
insert into t_user(id,name,age)values(next value for MYCATSEQ_GLOBAL,'hg-93',23)
主鍵的生成成功,除了這三種方式以外還可以通過`zookeeper`來維護自增的主鍵,這個可以自行實現
關註微信公眾號【程式員的夢想】,專註於Java,SpringBoot,SpringCloud,微服務,Docker以及前後端分離等全棧技術。