首页 > 解决方案 > SQLite 中的后备 UPDATE 语句

问题描述

我想在 SQLite 中运行一个 UPDATE 语句,当没有行会受到第一个影响时,它将转换为另一个 UPDATE 语句。在 t-sql 我可以简单地写

IF EXISTS (SELECT * FROM Table WHERE Field1 = @FieldValue) 
   UPDATE Table WITH (ROWLOCK) 
   SET OtherField1 = @OtherField1Value,
       OtherField2 = @OtherField2Value,
          ...
   WHERE Field1 = @FieldValue
ELSE
   UPDATE Table WITH (ROWLOCK)
   SET OtherField1 = @OtherField1Value,
       OtherField2 = @OtherField2Value,
   ...
   WHERE Field2 = @FieldValue

但是,这种语法在 SQLite 中不起作用。理想情况下,我更喜欢

标签: sqlsql-serversqlitetsql

解决方案


SQLite中没有WITH (ROWLOCK)等价物,而且 SQLite 也不支持变量或存储过程。
这将做到:

UPDATE Table 
SET OtherField1 = :OtherField1Value,
    OtherField2 = :OtherField2Value,
          ...
WHERE Field1 = :FieldValue
   OR (
         Field2 = :FieldValue 
         AND NOT EXISTS (SELECT 1 FROM table WHERE Field1 = :FieldValue)
      )

:values 替换为您要传递的参数。
该查询适用于 SQLite 和任何其他数据库(我能想到的),因为它是用标准 SQL 编写的。


推荐阅读