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

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

  • 相关阅读:
    [机器学习] k-近邻算法(knn)
    [博客] 博客园侧边栏公告设置访问人数及访客国家来源
    Ubuntu搭建hugo博客
    CodeForces
    Javaweb开发入门___1
    JDBC的学习
    Mysql的学习7___权限和数据库设计
    Mysql的学习6____事物,索引,备份,视图,触发器
    Mysql的学习5___Mysql常用函数,聚合函数,sql编程
    Mysql的学习3___数据的管理,主键 外键 以及增改删
  • 原文地址:https://www.cnblogs.com/doctorJoe/p/5261607.html
Copyright © 2011-2022 走看看