说明: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();
  • 测试结果

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

DESC t_auto_increment;

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

SELECT LAST_INSERT_ID();

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" />

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

# blow tables add by yzp 2016.03.10

TB_AUTO_INCREMENT=dn1

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

意思是说配置的时候没有找到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);

当前值为100,步长为1

测试使用:

第一组测试用例:

explain insert into tb_auto_increment(name)values('increment_01');

select * from tb_auto_increment;

explain select * from tb_auto_increment;

select last_insert_id();

explain select last_insert_id();

第二组测试用例:

explain insert into tb_auto_increment(name)values('increment_02');

select * from tb_auto_increment;

explain select * from tb_auto_increment;

select last_insert_id();

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

explain select last_insert_id();

的时候,我们看到:

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

最新文章

  1. ABAP 将单元格设置编辑状态 FORM
  2. Css格式与布局
  3. 赞!15个来自 CodePen 的酷炫 CSS 动画效果
  4. 解决erlang节点启动失败报[&quot;inet_tcp&quot;,econnrefused]的问题
  5. PS脚本获取网络适配器状态
  6. Unity AssetBundles and Resources指引 (二) Resources文件夹
  7. Linux C 程序 文件属性,文件删除(15)
  8. 利用Java反射机制完成XML到对象的解析
  9. WCF技术剖析之二十五: 元数据(Metadata)架构体系全景展现[元数据描述篇]
  10. linux_redhat_线程后台运行方法
  11. Qt creator中文输入—fctix-qt5 源码编译 libfcitxplatforminputcontextplugin.so
  12. Scala:枚举类型的用法
  13. 插件前奏-android黑科技 hook介绍
  14. 用 Java 解密 C# 加密的数据(DES)(转)
  15. Envoy 源码分析--network
  16. [EXP]windows全版本SMB溢出工具加强版
  17. 修改iptables后重启返回错误
  18. Thrift 安装及使用
  19. db first和code first
  20. hdu2732 Leapin&#39; Lizards 最大流+拆点

热门文章

  1. String类的常见方法的使用案例
  2. 【 Zabbix 】— 基础知识
  3. DRF的认证与权限功能
  4. 关于ros stage与navigation仿真总结5月16号
  5. flutte 命令行指令卡死
  6. HDU 2660 Accepted Necklace【数值型DFS】
  7. Hash算法详解
  8. 模板—算法—整体二分(区间k小值)
  9. 二分+Kruskal【p2798】爆弹虐场
  10. AtCoder - 2567 RGB Sequence