十三、Mycat-全局序列

  1. 在mycat conf目录下的sequence_db_conf.properties文件中添加如下内容:

    #sequence stored in datanode
    GLOBAL=dn1
    COMPANY=dn1
    CUSTOMER=dn1
    # 配置此项为你存放mycat_sequence表和函数的节点
    ORDERS=dn1

    dn1是你在schema.xml文件中的节点对应的数据库

  2. 修改Mycat配置文件server.xml

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

    1代表数据库模式,推荐此模式

  3. 在dn1节点的 orderdb1 数据库中添加 MYCAT_SEQUENCE表

    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;
    

     

  4. 在dn1节点的 orderdb1数据库中的 MYCAT_SEQUENCE 表插入sequence初始记录

    INSERT INTO MYCAT_SEQUENCE(name,current_value,increment) VALUES ('ORDERS', -99, 100);
    

    代表插入了一个名为mycat的sequence,当前值为-99,步长为100。此处的ORDERS要和sequence_db_conf.properties文件中配置的一致

  5. 在dn1节点的 orderdb1数据库中创建存储过程

    1. 获取当前sequence的值:
      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 ;

       

    2. 设置sequence值:
      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 ;

       

    3. 获取下一个sequence值:
      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 ;

      获取全局id的配置已经准备完毕。

  6. 调用

    -- 建表
    create table test(id int,name varchar(10));
    -- 插入数据 MYCATSEQ_ORDERS 这个ORDERS就代表之前配置的那个变量
    insert into test(id,name) values(next value for MYCATSEQ_ORDERS,(select database()));

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值