【问题标题】:Update or add value with id使用 id 更新或添加值
【发布时间】:2020-10-02 21:34:40
【问题描述】:

我刚刚学习 SQLDelight,并希望找到如何添加一个带有 ID 的对象,如果它不存在,如果它确实存在,然后用给定的 id 更新当前对象。

目前,我正在删除带有 id 的当前对象,然后添加一个对象,并希望将其简化为一个简单的调用。

我当前的代码:

CREATE TABLE Color (
  id TEXT NOT NULL,
  name TEXT NOT NULL,
  hex TEXT NOT NULL
);

getColorWithId:
SELECT * FROM Color
WHERE id = ?;

saveColor:
INSERT OR REPLACE INTO Color (id, name, hex)
VALUES (?, ?, ?);

deleteColorWithId:
DELETE FROM Color
WHERE id = ?;

我希望将其更改为将 saveColor 和 deleteColorWithId 替换为:

updateColorWithId:
INSERT OR REPLACE INTO Color (id, name, hex)
WHERE id = ?
VALUES (?, ?, ?);

但它不适用于此错误<insert stmt values real> expected, got 'WHERE'

谁能帮忙?我在文档中找不到任何内容。

【问题讨论】:

    标签: sql sqldelight


    【解决方案1】:

    您的声明 saveColor 用作 UPSERT 命令,它完全按照您的意愿工作。您无需创建另一个语句。

    INSERT OR REPLACE INTO Color (id, name, hex)
    VALUES (?, ?, ?);
    

    您必须在id 列上指定PRIMARY KEY,并且可以将saveColor 用作updateColorWithId。

    【讨论】:

    • 嗯好的,所以通过添加主键可以确保它不能重复并且ID必须是唯一的?如果它不是唯一的,则更新它,如果它是唯一的,则创建一个新记录?
    • 是的。需要存在PRIMARY KEY 或UNIQUE 约束。
    • 非常感谢,所以更好的名字真的是saveOrUpdateColor 而不是updateColorWithId
    • 是的。这个名字更好
    【解决方案2】:

    你已经在那里了,试试这样的:

    检查记录是否存在。如果是,则更新,否则添加新行。根据文档使用命名参数将是理想的。 https://cashapp.github.io/sqldelight/native_sqlite/query_arguments/

    updateOrInsert:
    IF EXISTS (SELECT 1 FROM Color WHERE id = :id) 
      BEGIN
        UPDATE Color
        SET id = :id, 
            name = :name, 
            hex = :hex
        WHERE id = :id 
      END
    ELSE
      BEGIN
        INSERT INTO Color(id, name, hex)
        VALUES (:id, :name, :hex);
      END
    

    用法

    dbQuery.updateOrInsert(id = BGColor.id, name = bgColor.name, hex = bgColor.hex)
    

    看看这个,可能有用REPLACE INTO vs Update

    【讨论】:

    • 谢谢!如果我要像 dbQuery.updateColorWithId(BGColor.id, bgColor.name, bgColor.hex) 那样调用数据库,我将如何将其放入我的 .sq 文件中?
    • 不客气,虽然我自己没有使用过SQLDelight,但我按照模式修改了答案。请检查一下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-25
    • 1970-01-01
    相关资源
    最近更新 更多