バッチ
BATCH構文は、TiDB 内で DML 文を複数の文に分割して実行します。つまり、トランザクションの原子性と独立性は保証されません。したがって、これは「非トランザクション」文です。
現在、 BATCHではINSERT 、 REPLACE 、 UPDATE 、 DELETEがサポートされています。
BATCH構文は、列に基づいてDML文を複数の実行範囲に分割します。各範囲では、1つのSQL文が実行されます。
使用方法および制限事項の詳細については、 非トランザクションDMLステートメント参照してください。
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
注記:
BATCH文は実行時に内部的に書き換えられ、複数のDML文に分割されます。現在のバージョンでは、テーブルエイリアスが保持されない可能性があり、Unknown column '<alias>.<column>' in 'where clause'のようなエラーが発生する可能性があります。この問題を回避するには、テーブルエイリアスを使用しないでください。実行前に、DRY RUN QUERYまたはDRY RUNを使用して分割文をプレビューしてください。詳細については、 非トランザクションDMLステートメント参照してください。
概要
- NonTransactionalDMLStmt
- DryRunOptions
- ShardableStmt
NonTransactionalDMLStmt ::=
'BATCH' ( 'ON' ColumnName )? 'LIMIT' NUM DryRunOptions? ShardableStmt
DryRunOptions ::=
'DRY' 'RUN' 'QUERY'?
ShardableStmt ::=
DeleteFromStmt
| UpdateStmt
| InsertIntoStmt
| ReplaceIntoStmt
MySQLの互換性
BATCH構文は TiDB 固有であり、MySQL とは互換性がありません。