BATCH

BATCH 语句将一个 DML 语句拆成多个语句在内部执行,因此不保证事务的原子性和隔离性,是一个“非事务”语句。

目前 BATCH 语句支持 INSERTREPLACEUPDATEDELETE

BATCH 语句在某一列将 DML 语句涉及的范围划分为多个区间,在每个区间执行一条 SQL。

详细的说明和使用限制见非事务语句

在涉及多表 join 时,BATCH 语法中指定拆分列时需要指明完整的路径以避免歧义,如:

  1. 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 的形式,则会报错:

  1. BATCH ON id LIMIT 1 INSERT INTO t SELECT t2.id, t2.v, t3.v FROM t2 JOIN t3 ON t2.k = t3.k;
  2. Non-transactional DML, shard column must be fully specified

语法图

NonTransactionalDMLStmt

BATCH - 图1

DryRunOptions

BATCH - 图2

ShardableStmt

BATCH - 图3

  1. NonTransactionalDMLStmt ::=
  2. 'BATCH' ( 'ON' ColumnName )? 'LIMIT' NUM DryRunOptions? ShardableStmt
  3. DryRunOptions ::=
  4. 'DRY' 'RUN' 'QUERY'?
  5. ShardableStmt ::=
  6. DeleteFromStmt
  7. | UpdateStmt
  8. | InsertIntoStmt
  9. | ReplaceIntoStmt

MySQL 兼容性

BATCH 语句是 TiDB 独有的语句,与 MySQL 不兼容。

另请参阅