insert兼容性

  1. INSERT [INTO] [schema_name.]tbl_name
  2. [(col_name,...)]
  3. {VALUES | VALUE} ({expr },...),(...),...
  4. [ ON DUPLICATE KEY UPDATE
  5. col_name=expr
  6. [, col_name=expr] ... ]

检查项

last_insert_id在自增主键的情况下能在报文中正确返回id和在sql中使用last_insert_id()函数可以查询id变量
单表
只会把SQL转发对应节点
全局表
把sql往配置的(多个)dataNode下发
分片表
带有分片字段的sql发往对应的dataNode
不带分片字段则往(多个)dataNode下发

在分片表下

不支持分片键使用函数运算,也不能是子查询
不支持 PARTITION 语法
注意如果带有子查询,该子查询不能查询物理表中不存在的表

不支持分片键的分片键带有默认值约束,分片值必须显式指定,对于全局二级索引的分片键也是如此
对于时间类型,请使用字符串表达,例如

  1. INSERT INTO `travelrecord2`(`id`,`user_id`,`traveldate`,`fee`,`days`,`blob`)
  2. VALUES
  3. (6,2,'2021-02-22 18:34:05.983692',4.5,4,NULL),
  4. (7,2,'2021-02-22 18:34:05.983692',4.5,4,NULL),
  5. (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

  1. [ ON DUPLICATE KEY UPDATE
  2. col_name=expr
  3. [, col_name=expr] ... ]

只支持col_name=expr这样的键值对,顺序不能颠倒,由于Mycat2暂时没有对insert语句的条件生成聚合(需要修改行)的结果集,然后使用该结果集进行生成发送给mysql的insert语句.Mycat2只是生成insert语句进行分发,请使用explain语句检查sql是否正确.

explain的使用方法

  1. explain INSERT INTO `travelrecord2`(`id`,`user_id`,`traveldate`,`fee`,`days`,`blob`)
  2. VALUES
  3. (6,2,'2021-02-22 18:34:05.983692',4.5,4,NULL),
  4. (7,2,'2021-02-22 18:34:05.983692',4.5,4,NULL),
  5. (8,2,'2021-02-22 18:34:05.983692',4.5,4,NULL);

分片表会对批量插入分解,按分表名分组,每组最大1000个值(server.json可修改)进行并行插入