Upsert data: upsert()
Perform an UPSERT on the table or view. Depending on the column(s) passed
to onConflict, .upsert() allows you to perform the equivalent of
.insert() if a row with the corresponding onConflict columns doesn't
exist, or if it does exist, perform an alternative action depending on
ignoreDuplicates.
By default, upserted rows are not returned. To return it, chain the call
with .select().
1const { data, error } = await supabase
2 .from('countries')
3 .upsert({ id: 1, name: 'Albania' })
4 .select()
Parameters#
valuesrequired
|RowarrayThe values to upsert with. Pass an object to upsert a single row or an array to upsert multiple rows.
- required
objectobjectNo description provided.
Rowrequired
objectNo description provided.
Properties
optionsrequired
objectNamed parameters
countoptional
|exact|plannedestimatedCount algorithm to use to count upserted rows.
"exact": Exact but slow count algorithm. Performs aCOUNT(*)under the hood."planned": Approximated but fast count algorithm. Uses the Postgres statistics under the hood."estimated": Uses exact count for low numbers and planned count for high numbers.ignoreDuplicatesoptional
booleanIf
true, duplicate rows are ignored. Iffalse, duplicate rows are merged with existing rows.onConflictoptional
stringComma-separated UNIQUE column(s) to specify how duplicate rows are determined. Two rows are duplicates if all the
onConflictcolumns are equal.
Properties
Notes#
- Primary keys must be included in
valuesto use upsert.
Examples#
Upsert your data#
1create table
2 countries (id int8 primary key, name text);
3
4insert into
5 countries (id, name)
6values
7 (1, 'Afghanistan');
Bulk Upsert your data#
1create table
2 countries (id int8 primary key, name text);
3
4insert into
5 countries (id, name)
6values
7 (1, 'Afghanistan');
Upserting into tables with constraints#
In the following query, upsert() implicitly uses the id
(primary key) column to determine conflicts. If there is no existing
row with the same id, upsert() inserts a new row, which
will fail in this case as there is already a row with handle "saoirse".
1create table
2 users (
3 id int8 generated by default as identity primary key,
4 handle text not null unique,
5 display_name text
6 );
7
8insert into
9 users (id, handle, display_name)
10values
11 (1, 'saoirse', null);
Using the onConflict option, you can instruct upsert() to use
another column with a unique constraint to determine conflicts:
1await supabase
2 .from('users')
3 .upsert(
4 { id: 42, handle: 'saoirse', display_name: 'Saoirse' },
5 { onConflict: 'handle' },
6 )
7const { data, error } = await supabase
8 .from('users')
9 .select()