说明:MyCAT自增长主键和返回生成主键ID的实现
1) mysql本身对非自增长主键,使用last_insert_id()是不会返回结果的,只会返回0;这里做一个简单的测试
创建测试表
----------------------------------------创建测试表-------------------------------------
USEtest;CREATE TABLE
IF NOT EXISTSt_auto_increment (
idINT NOT NULL PRIMARY KEY,
NAMEVARCHAR (50)
) ENGINE= INNODB DEFAULT CHARSET = utf8;
添加测试语句
INSERT INTO t_auto_increment(id,name) VALUES(1,'auto_01');SELECT LAST_INSERT_ID();
测试结果
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5CZ2UGZlZzYxUWYxEjY0kjZ1UWYmdTNhVWMxImNkJDOk9CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
修改表
ALTER TABLE t_auto_increment MODIFY id intauto_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 EXISTStb_auto_increment (
idINT NOT NULL PRIMARY KEYauto_increment,
NAMEVARCHAR (100)
)DEFAULT charset = utf8;
2) mycat定义主键自增:修改schema.xml
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 INTOmycat_sequence (
NAME,
current_value,
increment
)VALUES('tb_auto_increment', 100, 1);
当前值为100,步长为1
测试使用:
第一组测试用例:
explain insert into tb_auto_increment(name)values('increment_01');select * fromtb_auto_increment;
explainselect * from tb_auto_increment;
selectlast_insert_id();
explainselect last_insert_id();
第二组测试用例:
explain insert into tb_auto_increment(name)values('increment_02');select * fromtb_auto_increment;
explainselect * from tb_auto_increment;
select last_insert_id();
总结:最开始有一点小的疑问,在进行插入的时候,mycat会自动分配到配置的两个数据库上,但是在执行
explain select last_insert_id();
的时候,我们看到:
只会从一个库中去查询,但后来仔细一想也对啊,因为添加到两个库的数据是一致的,所以就没有必要去每一个库都去查询了。当然,具体的还好去看源码。