mycat全局表实战应用简析(下):多节点自增字段的处理

在这一篇我们已经了解了mycat全局表的概念:
http://blog.csdn.net/github_26672553/article/details/78125554
我们从终端里连接上mycat,然后创建了news_class数据表。

现在我们想要往这个表里插入数据:

INSERT INTO news_class (`class_name`) VALUES ('php');

呃呃,报错啦
Error : mycat sequnce err.java.lang.NumberFormatException: null

是因为:我们news_class表中的字段class_id是自增字段,需要mycat特别处理。

自增字段处理

从mycat获取自增字段有3种方式:从文件配置里获取、从数据库获取、本地时间戳

从文件配置里获取自增字段

1、设置从文件里获取
server.xml里配置

    <system>
        <property name="defaultSqlParser">druidparser</property>
        <!-- 0 代表从文件配置里读取自增字段 -->
        <property name="sequnceHandlerType">0</property>
    </system>

sequnceHandlerType1从数据库获取自增字段。

2、哪个文件?
sequence_conf.properties这个文件

#部分配置
#default global sequence
GLOBAL.HISIDS=
GLOBAL.MINID=10001
GLOBAL.MAXID=20000
GLOBAL.CURID=10000

MINID最小ID,MAXID最大ID,CURID当前ID。
明白了意思,你可以根据自己需要修改。

如果执行我们执行:

SELECT next VALUE FOR MYCATSEQ_GLOBAL;

得到的结构是:10001

3、现在我们往要news_class全局表里插入一条数据

INSERT INTO news_class (`class_id`,`class_name`) VALUES (next VALUE FOR MYCATSEQ_GLOBAL,'php');

这样就解决了calss_id这个自增id的问题了。

记住:我们刚才是往mycat里插入的,因为是全局表,其他节点的表里也同时插入的该条记录。

4、sequence_conf.properties配置的更多

# self define sequence
MY.HISIDS=
MY.MINID=10
MY.MAXID=2000
MY.CURID=19

这是我自定义的sequence,怎么获取呢?

SELECT next VALUE FOR MYCATSEQ_MY; # 就是替换一下

值得注意是: 如果你要切换到另外一个sequence,那么之前使用过的再下一次使用又回到了原点。什么意思?

从数据库获取自增字段的值

需要在你指定的某个节点的数据库中新建一个MYCAT_SEQUENCE

#该表字段
name   #sequence名称
current_value #当前value
Increment   #每次增长值

还要新建一些函数。

这里不啰嗦了,详细看下面文档:

#建表
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); 


#获取当前 ID
DROP FUNCTION IF EXISTS mycat_seq_currval; 
DELIMITER //
CREATE FUNCTION mycat_seq_currval(seq_name VARCHAR(50)) RETURNS varchar(64)  
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;//


#设置
DROP FUNCTION IF EXISTS mycat_seq_setval; 
DELIMITER//
CREATE FUNCTION mycat_seq_setval(seq_name VARCHAR(50),value INTEGER) RETURNS varchar(64) 
DETERMINISTIC 
BEGIN 
UPDATE MYCAT_SEQUENCE 
SET current_value = value 
WHERE name = seq_name; 
RETURN mycat_seq_currval(seq_name); 
END;//



#获取下一个(新的ID)
DROP FUNCTION IF EXISTS mycat_seq_nextval; 
DELIMITER //
CREATE FUNCTION mycat_seq_nextval(seq_name VARCHAR(50)) RETURNS varchar(64)
DETERMINISTIC 
BEGIN 
UPDATE MYCAT_SEQUENCE 
SET current_value = current_value + increment WHERE name = seq_name; 
RETURN mycat_seq_currval(seq_name); 
END;//

到这里,我们就介绍了2种方式来处理mycat全局表中 自增字段的问题。我个人觉得 从文件中获取自增字段的值 这种方式更加简单。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值