跳到主要内容

更新或创建数据

初始化 SDK

import cloudbase from "@cloudbase/js-sdk";

const app = cloudbase.init({
env: "your-env-id", // 替换为您的环境id
});

const db = app.rdb();

// 或指定实例和数据库
// const db = app.rdb({
// instance: "<instance>",
// database: "<database>"
// });

更新或创建数据

通过 upsert() 方法执行更新或插入操作,如果记录不存在则插入,存在则更新。

db.from(tableName).upsert(values, options)
  • tableName:表名称
  • values:要 upsert 的数据
  • options:upsert 选项配置

参数说明

参数类型必填说明
valuesobject | Array要 upsert 的值。传递对象以 upsert 单行,或传递数组以 upsert 多行
optionsobjectupsert 选项配置

options 参数说明

参数类型必填说明
countstring用于计算 upserted 行数的计数算法:"exact" - 底层执行 COUNT(*)
ignoreDuplicatesboolean如果为 true,则忽略重复行。如果为 false,则重复行与现有行合并
onConflictstring逗号分隔的唯一索引列,用于指定如何确定重复行。当所有指定的列都相等时,两行被视为重复。在 MySQL 中,这通常对应于唯一索引或主键

代码示例

Upsert 数据

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

console.log('Upsert 结果:', data);

批量 Upsert 数据

// 批量 upsert 多条记录:id 为 1 的记录 title 设为"MySQL 教程",id 为 2 的记录 title 设为"Redis 指南"
const { data, error } = await db.from("articles").upsert([
{ id: 1, title: "MySQL 教程" },
{ id: 2, title: "Redis 指南" },
]);

console.log('批量 Upsert 结果:', data);

指定冲突列

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

console.log('指定冲突列 Upsert 结果:', data);

返回结果

{
data: [
{
id: 1,
title: "MySQL 教程",
content: "文章内容"
}
],
error: null
}

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