Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果记录存在,如何更新?如果不在SQLite中,如何插入?_Sql_Sqlite - Fatal编程技术网

如果记录存在,如何更新?如果不在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。这就是我所做的,它工作得非常好。非常感谢。对不起,我迟了答复