更新或创建数据
初始化 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 选项配置
参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| values | object | Array | 是 | 要 upsert 的值。传递对象以 upsert 单行,或传递数组以 upsert 多行 |
| options | object | 否 | upsert 选项配置 |
options 参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| count | string | 否 | 用于计算 upserted 行数的计数算法:"exact" - 底层执行 COUNT(*) |
| ignoreDuplicates | boolean | 否 | 如果为 true,则忽略重复行。如果为 false,则重复行与现有行合并 |
| onConflict | string | 否 | 逗号分隔的唯一索引列,用于指定如何确定重复行。当所有指定的列都相等时,两行被视为重复。在 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 中的唯一索引列。