insert兼容性
INSERT [INTO] [schema_name.]tbl_name
[(col_name,...)]
{VALUES | VALUE} ({expr },...),(...),...
[ ON DUPLICATE KEY UPDATE
col_name=expr
[, col_name=expr] ... ]
检查项
last_insert_id在自增主键的情况下能在报文中正确返回id和在sql中使用last_insert_id()函数可以查询id变量
单表
只会把SQL转发对应节点
全局表
把sql往配置的(多个)dataNode下发
分片表
带有分片字段的sql发往对应的dataNode
不带分片字段则往(多个)dataNode下发
在分片表下
不支持分片键使用函数运算,也不能是子查询
不支持 PARTITION 语法
注意如果带有子查询,该子查询不能查询物理表中不存在的表
不支持分片键的分片键带有默认值约束,分片值必须显式指定,对于全局二级索引的分片键也是如此
对于时间类型,请使用字符串表达,例如
INSERT INTO `travelrecord2`(`id`,`user_id`,`traveldate`,`fee`,`days`,`blob`)
VALUES
(6,2,'2021-02-22 18:34:05.983692',4.5,4,NULL),
(7,2,'2021-02-22 18:34:05.983692',4.5,4,NULL),
(8,2,'2021-02-22 18:34:05.983692',4.5,4,NULL);
insert into …. on duplicateKey
不能更新分片键,或者分片键和主键在更新后仍然在同一个分区(分表)
注意DAO/ORM/等框架根据插入语句生成的select语句有问题
v1.22-2022-4-22
[ ON DUPLICATE KEY UPDATE
col_name=expr
[, col_name=expr] ... ]
只支持col_name=expr这样的键值对,顺序不能颠倒,由于Mycat2暂时没有对insert语句的条件生成聚合(需要修改行)的结果集,然后使用该结果集进行生成发送给mysql的insert语句.Mycat2只是生成insert语句进行分发,请使用explain语句检查sql是否正确.
explain的使用方法
explain INSERT INTO `travelrecord2`(`id`,`user_id`,`traveldate`,`fee`,`days`,`blob`)
VALUES
(6,2,'2021-02-22 18:34:05.983692',4.5,4,NULL),
(7,2,'2021-02-22 18:34:05.983692',4.5,4,NULL),
(8,2,'2021-02-22 18:34:05.983692',4.5,4,NULL);
分片表会对批量插入分解,按分表名分组,每组最大1000个值(server.json可修改)进行并行插入