Upsert 数据
upsert()用于对表(table)或视图(view)执行 UPSERT 操作。
在关系型数据库中,Upsert是一种结合了"插入(Insert)"和"更新(Update)"的操作,它允许我们在表或视图上执行插入或更新操作。 通常情况下,当我们想要向数据库中插入一行数据时,我们会使用INSERT语句。 但是,如果该行数据已经存在(通常通过主键来判断),我们可能希望更新该行数据而不是插入重复的数据。
Upsert通过传递列到onConflict
方法,我们可以使用.upsert()
来实现以下功能:
- 如果不存在具有相应
onConflict
列的行,则执行等效于.insert()
的插入操作。 - 如果存在具有相应
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;