SQLite - 为什么不将此作为语法错误抛出?

时间:2017-05-02 10:34:02

标签: sql sqlite

我花了最后一小时试图找出我的SQLite数据库没有更新的原因。

正在进行的查询是

UPDATE Table SET col1 = val AND col2 = val2 AND col3 = val3 WHERE col1 = val4

显然这是更新查询的错误语法,但是没有抛出任何异常,没有显示错误,并且直接使用SQLiteBrowser运行它甚至表示查询正确执行并更新了一行(但没有更新)已经完成了)

有人可以解释为什么这个查询没有被异常或语法错误拒绝吗?

更新

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

1 个答案:

答案 0 :(得分:2)

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

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

1 AND 1 = 1 AND 1 = 1

...这是一个有效的表达式,其值为1。

即使WHERE中的新值与旧值相同,SQLite也会报告col1子句与{{1}}子句匹配的行数 em>,即使数据实际上没有变化。它仍然发现要更新的行并在其中添加新值,因此它报告已成功执行更新。

我们需要知道列的类型/值,以确切了解其中发生了什么,但我没有看到语法错误,尽管它很清楚你并不意味着做表达(有效!)说的话!