BATCH
BATCH 语句将一个 DML 语句拆成多个语句在内部执行,因此不保证事务的原子性和隔离性,是一个“非事务”语句。
目前 BATCH 语句支持 INSERT
、REPLACE
、UPDATE
、DELETE
。
BATCH 语句在某一列将 DML 语句涉及的范围划分为多个区间,在每个区间执行一条 SQL。
详细的说明和使用限制见非事务语句。
在涉及多表 join 时,BATCH
语法中指定拆分列时需要指明完整的路径以避免歧义,如:
BATCH ON test.t2.id LIMIT 1 INSERT INTO t SELECT t2.id, t2.v, t3.v FROM t2 JOIN t3 ON t2.k = t3.k;
上面这条语句的拆分列用 test.t2.id
指明,不具有歧义。如果写成如下 id
的形式,则会报错:
BATCH ON id LIMIT 1 INSERT INTO t SELECT t2.id, t2.v, t3.v FROM t2 JOIN t3 ON t2.k = t3.k;
Non-transactional DML, shard column must be fully specified
语法图
NonTransactionalDMLStmt
DryRunOptions
ShardableStmt
NonTransactionalDMLStmt ::=
'BATCH' ( 'ON' ColumnName )? 'LIMIT' NUM DryRunOptions? ShardableStmt
DryRunOptions ::=
'DRY' 'RUN' 'QUERY'?
ShardableStmt ::=
DeleteFromStmt
| UpdateStmt
| InsertIntoStmt
| ReplaceIntoStmt
MySQL 兼容性
BATCH 语句是 TiDB 独有的语句,与 MySQL 不兼容。