Upsert 数据

upsert()用于对表(table)或视图(view)执行 UPSERT 操作。

在关系型数据库中,Upsert是一种结合了"插入(Insert)"和"更新(Update)"的操作,它允许我们在表或视图上执行插入或更新操作。 通常情况下,当我们想要向数据库中插入一行数据时,我们会使用INSERT语句。 但是,如果该行数据已经存在(通常通过主键来判断),我们可能希望更新该行数据而不是插入重复的数据。

Upsert通过传递列到onConflict方法,我们可以使用.upsert()来实现以下功能:

  1. 如果不存在具有相应onConflict列的行,则执行等效于.insert()的插入操作。
  2. 如果存在具有相应onConflict列的行,则根据ignoreDuplicates的设置执行另一种操作。

需要注意的是,为了使用upsert,必须在values中包含主键。主键是用于唯一标识表中每一行的一列或一组列,确保数据的唯一性和完整性。

案例教程

案例1 (Upsert数据)#

1                                                                              
2await supabase
3  .from('messages')
4  .upsert({ 'id': 3, 'message': 'foo', 'username': 'supabot' });

案例2 (将数据Upsert到带有约束的表中)#

1                                                                              
2await supabase
3  .from('users')
4  .upsert({ 'username': 'supabot' }, { 'onConflict': 'username' });

案例3 (返回确切的行数)#

1                                                                              
2final res = await supabase.from('users').upsert(
3  {'id': 3, 'message': 'foo', 'username': 'supabot'},
4  options: const FetchOptions(count: CountOption.exact),
5);
6
7final data = res.data;
8final count = res.count;