??前面我們介紹了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以及前后端分離等全堆疊技術,

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/115813.html
標籤:MySQL
上一篇:mysql主從搭建
