sqlite 如何更新某些列的值而忽略其他列,同时在必要时插入一行?

f5emj3cl  于 2022-12-13  发布在  SQLite
关注(0)|答案(1)|浏览(159)

我有一个表,在列FirstNameLastName上有一个复合主键。我想设置Age列,但不设置Address。如果不存在该人员的行,则创建该行(并将Address设置为NULL)。
我试着这样REPLACE INTO:

REPLACE INTO
    answers
    (
        FirstName,
        LastName,
        Age
    )
VALUES
    (
        :first_name,
        :last_name,
        :age
    )

但这也会使Address无效。
我发现了一些与ON DUPLICATE有关的东西,但似乎只有mysql才有,然后我听说ON CONFLICT可以做类似的事情,所以我开始阅读this page,感到非常困惑。我也找不到任何使用ON CONFLICT和复合主键的例子。
我使用的是SQLite 3.31.1。

s4chpxco

s4chpxco1#

您可以使用UPSERT执行此操作:

INSERT INTO answers (FirstName, LastName, Age, Address)
VALUES (:first_name, :last_name, :age, :address)
ON CONFLICT DO UPDATE
SET Age = EXCLUDED.Age;

或者,如果您不想在插入的列中设定Address的值:

INSERT INTO answers (FirstName, LastName, Age)
VALUES (:first_name, :last_name, :age)
ON CONFLICT DO UPDATE
SET Age = EXCLUDED.Age;

如果表中已经存在:first_name:last_name的组合,则将执行UPDATE语句,这不会影响列Address
请参阅demo

相关问题