mycat设置主键自增—sequence的配置

1. 配置server.xml文件

(#0 代表文件方式,#1 代表数据库方式,#2 代表本地时间戳方式)

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

配置server.xml

2. 数据库配置

Sequence 获取步骤:

  1. 初次使用该 sequence 时,根据传入的 sequence 名称,从数据库这张表中读取 current_value和 increment 到 MyCat 中,并将数据库中的 current_value 设置为原 current_value 值+increment 值。
  2. MyCat 将读取到 current_value+increment 作为本次要使用的 sequence 值,下次使用时,自动加 1,当使用 increment 次后,执行步骤 1)相同的操作。
  3. MyCat 负责维护这张表,用到哪些 sequence,只需要在这张表中插入一条记录即可。若某次读取的sequence 没有用完,系统就停掉了,则这次读取的 sequence 剩余值不会再使用。
#所有操作都在一个物理数据库(dn1)上
#创建 MYCAT_SEQUENCE 表
#name sequence 名称
#current_value 当前 value
#increment 增长步长! 可理解为 mycat 在数据库中一次读取多少个 sequence. 当这些用完后, 下次再从数
#据库中读取。

DROP TABLE IF EXISTS MYCAT_SEQUENCE;
CREATE TABLE MYCAT_SEQUENCE (
  `name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '名称',
  `current_value` int(11) NOT NULL COMMENT '当前值',
  `increment` int(11) NOT NULL DEFAULT 1 COMMENT '增长步长',
  PRIMARY KEY (`name`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

#创建相关 function
#获取当前 sequence 的值 (返回当前值,增量)
DROP FUNCTION IF EXISTS mycat_seq_currval;
DELIMITER ;;
CREATE DEFINER=`root`@`%` 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 ;

#设置 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 utf8
DETERMINISTIC
BEGIN
UPDATE MYCAT_SEQUENCE
SET current_value = value
WHERE name = seq_name;
RETURN mycat_seq_currval(seq_name);
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 utf8
DETERMINISTIC
BEGIN
UPDATE MYCAT_SEQUENCE SET current_value = current_value + increment
WHERE NAME = seq_name;
RETURN mycat_seq_currval(seq_name);
END;;
DELIMITER ;

3. 修改mycat 相关配置

sequence_db_conf.properties

#sequence stored in datanode
GLOBAL=dn1
COMPANY=dn1
CUSTOMER=dn1
ORDERS=dn1
SYS_USER=dn1

在这里插入图片描述

配置schema.xml

<schema name="DB1" checkSQLschema="false" sqlMaxLimit="100">
	<table name="sys_user" primaryKey="user_id" autoIncrement="true" dataNode="dn$1-2" rule="rule1"/>            
</schema>

<dataNode name="dn$1-2" dataHost="localhost1" database="db$1-2" />

<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
	<heartbeat>select user()</heartbeat>
	<writeHost host="hostM1" url="xxxx:8066" user="mycat" password="xxxxxx">
	</writeHost>
</dataHost>

4.修改mysql的配置文件my.cnf

//-- [mysqld]下添加如下配置
//-- 如果不添加如下配置并发下会取重复...
log_bin_trust_function_creators=1

5. 重启mycat

./mycat restart

6.使用方法

  1. 不给id手动赋值
INSERT INTO sys_user(name) VALUES("姓名")
  1. 手动赋值主键
INSERT into sys_user(user_id,name) VALUES(next value for MYCATSEQ_SYS_USER,"姓名");
  1. 获取下一个主键id的方法(一般用于自己设置主键id)
    存在问题: 1. mycat服务启动或者重启时,第一次使用,获取的值为当前值+步长
                              (current_value+increment)
          2. 每使用一次,相当于插入一个id,MYCAT_SEQUENCE表对应会加一
# 注意:MYCATSEQ_ 拼接的字段为MYCAT_SEQUENCE中存储的name字段
SELECT 'next value for MYCATSEQ_SYS_USER'
  1. 获取数据存储节点,根据id查询,加一个EXPLAIN(必须大写),会返回存储节点。
EXPLAIN SELECT * from sys_user WHERE user_id = '100'

在这里插入图片描述

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZHAIKEsir

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值