zoukankan      html  css  js  c++  java
  • Mycat探索之旅(4)----Mycat的自增长主键和返回生成主键ID的实现

    说明:MyCAT自增长主键和返回生成主键ID的实现

    1) mysql本身对非自增长主键,使用last_insert_id()是不会返回结果的,只会返回0;这里做一个简单的测试

    • 创建测试表
    --------------------------------------
    --创建测试表
    -------------------------------------
    
    USE test;
    
    CREATE TABLE
    
    IF NOT EXISTS t_auto_increment (
    
    id INT NOT NULL PRIMARY KEY,
    
    NAME VARCHAR (50)
    
    ) ENGINE = INNODB DEFAULT CHARSET = utf8;
    • 添加测试语句
    INSERT INTO t_auto_increment(id,name) VALUES(1,'auto_01');
    
    SELECT LAST_INSERT_ID();
    • 测试结果

    clip_image001

    • 修改表
    ALTER TABLE t_auto_increment MODIFY id int auto_increment;
    
    DESC t_auto_increment;

    clip_image002

    • 添加测试
    INSERT INTO t_auto_increment(name) VALUES('auto_02');
    
    SELECT LAST_INSERT_ID();

    clip_image003

    2) mysql只会对定义自增长主键,可以用last_insert_id()返回主键值;MyCAT目前提供了自增长主键功能,但是如果对应的mysql节点上数据表,没 有定义auto_increment,那么在MyCAT层调用last_insert_id()也是不会返回结果的。

    正确配置方式如下:

    1) mysql定义自增主键

    --------------------------------------------
    
    --创建测试表
    
    --------------------------------------------
    
    CREATE TABLE
    
    IF NOT EXISTS tb_auto_increment (
    
    id INT NOT NULL PRIMARY KEY auto_increment,
    
    NAME VARCHAR (100)
    
    ) DEFAULT charset = utf8;

    2) mycat定义主键自增:修改schema.xml

    <!--autoIncrement="true"表示该表主键使用自增长策略-->
    
    <table name="tb_auto_increment" primaryKey="id" autoIncrement="true" dataNode="dn1,dn2" />

    clip_image004

    3) mycat对应sequence_db_conf.properties增加相应设置

    # blow tables add by yzp 2016.03.10
    
    TB_AUTO_INCREMENT=dn1

    注:这里的TB_AUTO_INCREMENT一定要大写,我最开始的时候用小写一直报下面的错误:

    image

    意思是说配置的时候没有找到TB_AUTO_INCREMENT,也就是sequence_db_conf.properties文件中添加的内容有误,当改为大写后,不再报错。

    4) 在数据库中mycat_sequence表中增加TABLE1表的sequence记录

    INSERT INTO mycat_sequence (
    
    NAME,
    
    current_value,
    
    increment
    
    )
    
    VALUES
    
    ('tb_auto_increment', 100, 1);

    clip_image005

    当前值为100,步长为1

    测试使用:

    第一组测试用例:

    explain insert into tb_auto_increment(name)values('increment_01');
    
    select * from tb_auto_increment;
    
    explain select * from tb_auto_increment;

    clip_image006

    select last_insert_id();
    
    explain select last_insert_id();

    clip_image007

    第二组测试用例:

    explain insert into tb_auto_increment(name)values('increment_02');
    
    select * from tb_auto_increment;
    
    explain select * from tb_auto_increment;

    clip_image008

    select last_insert_id();

    clip_image009

    总结:最开始有一点小的疑问,在进行插入的时候,mycat会自动分配到配置的两个数据库上,但是在执行

    explain select last_insert_id();

    的时候,我们看到:

    image

    只会从一个库中去查询,但后来仔细一想也对啊,因为添加到两个库的数据是一致的,所以就没有必要去每一个库都去查询了。当然,具体的还好去看源码。

  • 相关阅读:
    同一部电脑配两个git账号
    在span中,让里面的span垂直居中用这个
    三张图搞懂JavaScript的原型对象与原型链
    vue2.0 生命周期
    js中__proto__和prototype的区别和关系?
    【转】css 包含块
    【转】BFC(block formating context)块级格式化上下文
    javascript中函数的5个高级技巧
    toString() 和 valueOf()
    桌面图标列表排列小工具
  • 原文地址:https://www.cnblogs.com/doctorJoe/p/5261607.html
Copyright © 2011-2022 走看看