三个表的结构如下
向子表插入数据出现如下报错。
mycat:can't find (root) parent sharding node for sql
试了好久发现是表名的问题,原来是 Student,SC,Course,统一改成小写 student,sc,course就没有错了。
采用数据库方式进行全局序列的配置
使用其中一个dn来创建相应表与相应函数,这里使用dn1
建表
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;
创建函数
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 ;
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 ;
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 ;
配置server.xml
<property name="sequnceHandlerType">1</property>
为表设置初值
insert into MYCAT_SEQUENCE(name,current value,increment) values('STUDENT',1,1);
在sequence_db_conf.propersites中添加STUDENT=dn1
为student表添加主键与autoIncrement,此时插入时自动加1的属性即为primaryKey的属性。
<table name="student" primaryKey='id' dataNode="dn1,dn2" rule="mod-long" autoIncrement="true">
两种插入方式
insert into student(sno,sname,dno) values(63,'E',1);
insert into student(id,sno,sname,dno) values(next value for MYCATSEQ_STUDENT,64,'F',2);
如果想要手动调整id值
则需使用dn1对应的数据库中的MYCAT_SEQUENCE表执行
update table student set id=1 where name=STUDENT;