更新或创建数据
对表执行 UPSERT 操作。根据传递给冲突列的配置,.upsert()
允许您执行等效于 .insert()
的操作(如果不存在具有相应唯一约束的行),或者如果确实存在,则根据配置执行更新操作。
主键必须包含在值中才能使用 upsert。
参数
参数 | 类型 | 必需 | 说明 |
---|---|---|---|
values | Row/Array<Row> | 必需 | 要 upsert 的值。传递对象以 upsert 单行,或传递数组以 upsert 多行 |
options | object | 可选 | 命名参数 |
options 详细配置
参数 | 类型 | 必需 | 说明 |
---|---|---|---|
count | string | 可选 | 用于计算 upserted 行数的计数算法。"exact" - 底层执行 COUNT(*) |
ignoreDuplicates | boolean | 可选 | 如果为 true,则忽略重复行。如果为 false,则重复行与现有行合并 |
onConflict | string | 可选 | 逗号分隔的唯一索引列,用于指定如何确定重复行。当所有指定的列都相等时,两行被视为重复。在 MySQL 中,这通常对应于唯一索引或主键 |
defaultToNull | boolean | 可选 | 使缺失字段默认为 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 中的唯一索引列。