Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.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,我只是花了最后一个小时试图弄明白为什么我的SQLite数据库没有更新 正在执行的查询是 UPDATE Table SET col1 = val AND col2 = val2 AND col3 = val3 WHERE col1 = val4 显然,对于更新查询,这是错误的语法,但是没有引发异常,没有显示错误,直接使用它运行时,甚至说查询执行正确并且更新了一行(但没有进行更新) 有人能解释一下为什么这个查询没有因为异常或语法错误而被拒绝吗 更新: 因此,在进一步研究之后,我可以看到确实执行了更

我只是花了最后一个小时试图弄明白为什么我的SQLite数据库没有更新

正在执行的查询是

UPDATE Table SET col1 = val AND col2 = val2 AND col3 = val3 WHERE col1 = val4
显然,对于更新查询,这是错误的语法,但是没有引发异常,没有显示错误,直接使用它运行时,甚至说查询执行正确并且更新了一行(但没有进行更新)

有人能解释一下为什么这个查询没有因为异常或语法错误而被拒绝吗

更新:


因此,在进一步研究之后,我可以看到确实执行了更新,但是没有将
col1
设置为新值,而是将其设置为0,这似乎很奇怪。

大多数语言(包括SQLite)中的AND运算符可以在表达式中使用(用于布尔或按位操作等),而
=
运算符正在测试相等性,因此您只需将
col1
设置为等于表达式
val和col2=val2和col3=val3的值

例如,如果表达式中的所有列和值均为1,则将col1设置为:

1 AND 1 = 1 AND 1 = 1
…这是计算结果为1的有效表达式

SQLite将报告与
WHERE
子句匹配的受更新影响的行数,即使
col1
中的新值与旧值相同,也就是说,即使数据没有实际更改。它仍然找到要更新的行并在其中放入新值,因此它报告已成功执行更新


我们需要知道列的类型/值,才能准确地了解发生了什么,但我没有看到语法错误,尽管很明显,您并不是有意按照表达式(validly!)所说的去做

问:
WHERE
子句是否允许更新任何记录,如果其余语法合法?@TimBiegeleisen是,当我纠正了我愚蠢的错误后,这个查询就起作用了correctly@TimBiegeleisen这是同步方法的一部分,该方法在生成新记录后检索远程数据库中新创建的ID,然后根据旧的(临时)ID使用新ID更新本地数据库本地IDY但为什么当时没有执行
更新
?@TimBiegeleisen如果
更新
col1
更新为其现有值,SQLite仍会说一行已更新,但不会发生明显的更新。向上投票。我只是好奇,如果假设
WHERE
子句允许任何更新,是否会发生其他奇怪的事情。val4与val1不同,因此我希望col1已经更新(这没有发生)-即使它忽略了col2和3。所以我很好奇为什么会有这样的更新ignored@Takarii它可能不会被忽视。您说SQLite告诉您一行已更新;我猜想
col1
中的值已经等于布尔表达式的值。SQLite仍然会报告正在更新的行,但是
col1
中的值将与以前相同,因此看起来没有变化。请记住,您正在将
col1
设置为
val和col2=val2和col3=val3
,无论结果如何。