onConflictUpdate method

Mutation<F> onConflictUpdate({
  1. required List<ReadField<Object?>> target(
    1. F
    ),
  2. required List<Assignment> set(
    1. F existing,
    2. F incoming
    ),
})

Prepares a SQLite/PostgreSQL upsert against a declared unique target.

set distinguishes existing values from proposed incoming values and must return at least one assignment. MySQL/MariaDB use onDuplicateKeyUpdate.

Implementation

Mutation<F> onConflictUpdate({
  required List<ReadField<Object?>> Function(F) target,
  required List<Assignment> Function(F existing, F incoming) set,
}) {
  final fieldsFactory = this.fieldsFactory;
  if (fieldsFactory == null) {
    throw const OrmException(
      'MUTATION.CONFLICT',
      'Upsert applies to an insert.',
    );
  }
  final incoming = fieldsFactory(TableRef(queryState.source.schema));
  final assignments = set(queryFields, incoming);
  if (assignments.isEmpty) {
    throw const OrmException(
      'MUTATION.EMPTY',
      'Conflict update needs assignments.',
    );
  }
  return _withConflict(target(queryFields), assignments, incoming.table);
}