如果记录存在,如何更新?如果不在SQLite中,如何插入?
以下是我的声明:如果记录存在,如何更新?如果不在SQLite中,如何插入?,sql,sqlite,Sql,Sqlite,以下是我的声明: CASE WHEN EXISTS ( SELECT 1 FROM Transactions WHERE Hash = 'VLEYCBLTDGGLHVQEWWIQ' AND Time = 1531739096 )
CASE
WHEN
EXISTS
(
SELECT
1
FROM
Transactions
WHERE
Hash = 'VLEYCBLTDGGLHVQEWWIQ'
AND Time = 1531739096
)
THEN
UPDATE
Transactions
SET
BlockID = 0, PoolHeight = NULL
WHERE
Hash = 'VLEYCBLTDGGLHVQEWWIQ'
AND Time = 1531739096
ELSE
INSERT INTO Transactions (Hash, Time, _fROM, Signature, Mode, BlockID, OutputValue, PoolHeight)
VALUES('VLEYCBLTDGGLHVQEWWIQ', 1531739096, 'GENESIS', 'GENESIS', - 1, 0, 0, NULL)
END;
错误:
System.Data.SQLite.SQLiteException: 'SQL logic error near "CASE": syntax error'
基本上:如果Exists为true,那么我想更新记录。如果它不存在,我想插入记录。您需要在应用程序中这样做。案例表达式不能用于控制流。许多RDBMS为此支持IF语句,但SQLite不支持。SQLite的SQL方言不支持带有SQL的控制流 对于这个问题,您可以尝试使用,但是查看您的查询,它似乎与您尝试执行的操作不完全匹配。您将在冲突中更新签名、模式、BlockID、OutputValue和PoolHeight,而看起来您只想更新BlockID和PoolHeight 您可以使用
INSERT[…]ON CONFLICT UPDATE
语句,但我以前从未使用过所谓的。我相信会是这样的:
INSERT INTO Transactions (Hash, Time, _fROM, Signature, Mode, BlockID, OutputValue, PoolHeight)
VALUES('VLEYCBLTDGGLHVQEWWIQ', 1531739096, 'GENESIS', 'GENESIS', - 1, 0, 0, NULL)
ON CONFLICT (Hash, Time) DO UPDATE SET BlockID = 0, PoolHeight = NULL
WHERE Hash = 'VLEYCBLTDGGLHVQEWWIQ' AND Time = 1531739096;
然而,我自己从来没有在SQLite上使用过这个语句,所以我不确定它到底是如何工作的。似乎确实需要为冲突指定的列编制索引。我甚至不能完全肯定WHERE子句在这里是否必要。阅读文档并首先进行广泛的测试
另一种方法是每次运行UPDATE语句,然后运行INSERT。怎么样?我认为这不起作用,因为我没有在这里使用主键。老实说,如果()或者()就完美了。我只是想知道为什么我的表达式有语法错误。这是包含在里面的还是整个语句?我不认为你可以用CASE开头一个语句。这就是整个语句。如果你同时用省略号将UPDATE和INSERT命令括起来(UPDATE…)或者(INSERT…)END?>另一个选项是每次运行UPDATE语句,然后,如果没有受影响的记录,则运行INSERT。这就是我所做的,它工作得非常好。非常感谢。对不起,我迟了答复