Upsert 数据
upsert()用于对表(table)或视图(view)执行 UPSERT 操作。
在关系型数据库中,Upsert是一种结合了"插入(Insert)"和"更新(Update)"的操作,它允许我们在表或视图上执行插入或更新操作。 通常情况下,当我们想要向数据库中插入一行数据时,我们会使用INSERT语句。 但是,如果该行数据已经存在(通常通过主键来判断),我们可能希望更新该行数据而不是插入重复的数据。
Upsert通过传递列到onConflict
方法,我们可以使用.upsert()
来实现以下功能:
- 如果不存在具有相应
onConflict
列的行,则执行等效于.insert()
的插入操作。 - 如果存在具有相应
onConflict
列的行,则根据ignoreDuplicates
的设置执行另一种操作。
需要注意的是,为了使用upsert,必须在values
中包含主键。主键是用于唯一标识表中每一行的一列或一组列,确保数据的唯一性和完整性。
案例教程
案例1 (Upsert数据)#
1create table
2countries (id int8 primary key, name text);
3
4insert into
5countries (id, name)
6values
7(1, 'Afghanistan');
案例2 (批量Upsert数据)#
1create table
2countries (id int8 primary key, name text);
3
4insert into
5countries (id, name)
6values
7(1, 'Afghanistan');
案例3 (将数据Upsert到带有约束的表中)#
1create table
2users (
3 id int8 generated by default as identity primary key,
4 handle text not null unique,
5 display_name text
6);
7
8insert into
9users (id, handle, display_name)
10values
11(1, 'saoirse', null);
参数说明
值(value)[必要参数]
object类型
要用的值来upsert。传递一个对象来替换单行单一行,或者通过一个数组来插入多行。
选项(option)[可选参数]
object类型
命名的参数
count[可选参数]
|exact
|planned
estimated
用来计算更新行的计数算法。
exact:可以精确计算行数,但执行速度较慢。执行 COUNT(*) 操作。
planned:可以快速计算行数,但是结果可能略有偏差。使用了Postgres 的统计数据。
estimated:对于较小的数值使用精确计数,对于较大的数值使用计划计数。根据行数的大小决定使用精确计数或计划计数的算法。
defaultToNull[可选参数]
boolean类型
将缺失的字段设置为null。否则使用列的默认值。
ignoreDuplicates[可选参数]
boolean类型
用来计算更新行的计数算法。
如果为true,则忽略重复的行。如果为false,则将重复的行与现有行合并。
onConflict[可选参数]
string类型
用来计算更新行的计数算法。
逗号分隔的UNIQUE列,用于指定如何确定重复行。当所有onConflict列的值相等时,两行被视为重复。
特性