insertUsing method

Future<int> insertUsing(
  1. Iterable<String> columns,
  2. Query source, {
  3. bool ignoreConflicts = false,
})

Inserts rows into this query's table using the results of source. The columns list must contain one entry per value selected by source.

This method allows for efficient bulk insertion of data from another query.

columns are the target columns for insertion. source is the query whose results will be inserted. ignoreConflicts (defaults to false) whether to ignore duplicate key errors.

Example:

// Insert archived posts into a new 'old_posts' table
final insertedCount = await context.query<OldPost>()
  .insertUsing(
    ['title', 'body'],
    context.query<Post>().where('isArchived', true).select(['title', 'body']),
  );
print('Inserted $insertedCount old posts.');

Implementation

Future<int> insertUsing(
  Iterable<String> columns,
  Query<dynamic> source, {
  bool ignoreConflicts = false,
}) async {
  _ensureSupportsCapability(
    DriverCapability.insertUsing,
    context.driver.metadata.name,
    'insertUsing',
  );
  final resolved = _normalizeInsertColumns(columns);
  if (resolved.isEmpty) {
    throw ArgumentError.value(columns, 'columns', 'At least one column');
  }
  _ensureSharedContext(source, 'insertUsing');
  final selectPlan = source._buildPlan().copyWith(disableAutoHydration: true);
  final mutation = MutationPlan.insertUsing(
    definition: definition,
    columns: resolved,
    selectPlan: selectPlan,
    ignoreConflicts: ignoreConflicts,
    driverName: context.driver.metadata.name,
  );
  final result = await context.runMutation(mutation);
  return result.affectedRows;
}