跳到主要内容

更新或创建数据

对表执行 UPSERT 操作。根据传递给冲突列的配置,.upsert() 允许您执行等效于 .insert() 的操作(如果不存在具有相应唯一约束的行),或者如果确实存在,则根据配置执行更新操作。

主键必须包含在值中才能使用 upsert。

参数

参数类型必需说明
valuesRow/Array<Row>必需要 upsert 的值。传递对象以 upsert 单行,或传递数组以 upsert 多行
optionsobject可选命名参数

options 详细配置

参数类型必需说明
countstring可选用于计算 upserted 行数的计数算法。
"exact" - 底层执行 COUNT(*)
ignoreDuplicatesboolean可选如果为 true,则忽略重复行。如果为 false,则重复行与现有行合并
onConflictstring可选逗号分隔的唯一索引列,用于指定如何确定重复行。当所有指定的列都相等时,两行被视为重复。在 MySQL 中,这通常对应于唯一索引或主键
defaultToNullboolean可选使缺失字段默认为 null。否则,使用列的默认值。这只适用于插入新行时,不适用于在 ignoreDuplicates: false 下与现有行合并时。这也只适用于批量 upserts

代码示例

const app = cloudbase.init({
...
});

const db = app.mysql();

基础 upsert

Upsert 数据

// 如果 articles 表中存在 id 为 1 的记录则更新 title 为"MySQL 教程",不存在则插入新记录
const { data, error } = await db
.from("articles")
.upsert({ id: 1, title: "MySQL 教程" });

批量 Upsert 数据

// 根据 title 字段判断冲突,如果存在 title 为"唯一标题"的记录则更新,否则插入 id 为 42 的新记录
const { data, error } = await db
.from("articles")
.upsert(
{ id: 42, title: "唯一标题", content: "文章内容" },
{ onConflict: "title" }
);

说明:使用 upsert() 时必须包含主键列,这样才能正确判断是插入新行还是更新现有行。在 MySQL 中,upsert 通常通过 ON DUPLICATE KEY UPDATE 语法实现,当插入的数据与现有主键或唯一索引冲突时,会执行更新操作。onConflict 参数用于指定冲突判断的列,对应 MySQL 中的唯一索引列。