如果引用了列,则SQLite UPDATE语句不执行任何操作

时间:2014-01-23 22:26:29

标签: sql sqlite

我试图在我制作的示例表上执行SQL查询,如下所示:

name        text                                    number
----------------------------------------------------------
target      the cell to operate on                  5
cruft       cell here to simulate stuff happening   7

这是我试图执行的SQL查询:

UPDATE data SET 'name'='target', 'number'=2 WHERE 'name'='target';

我希望这会将第一行中的5更改为2。

当我尝试在SQLite Database Browser中执行此操作并最终在命令行sqlite版本3.7.13中执行此操作时,它报告没有错误,但也没有更改请求的条目。奇怪的是,如果从任一字符串'target'中删除引号,我会收到一条错误消息no such column: target,即使'target'没有被用作列名。删除'name'='target',部分不会改变任何内容。

最终我通过仅删除WHERE子句中'name'的单引号解决了当前的问题,这是混淆的。

UPDATE data SET 'name'='target', 'number'=3 WHERE name='target';

有谁知道为什么会发生这种情况,或者我如何处理引号以防止带有空格的假设列名称?

3 个答案:

答案 0 :(得分:1)

您正在测试字符串'name'是否等于字符串'target'

您应该为列名使用双引号:

UPDATE data SET "name"='target', "number"=3 WHERE "name"='target';

参考:https://www.sqlite.org/lang_keywords.html

答案 1 :(得分:1)

对字符串文字使用单引号,即您要分配给列的值。使用双引号作为标识符,即列或表的名称。见http://sqlite.org/faq.html#q24

因此,对于您的示例,应该阅读

UPDATE data SET "name"='target', "number"=2 WHERE "name"='target';

答案 2 :(得分:0)

单引号用于字符串常量。在MySQL中,对变量名称使用返回滴答 - 或者更好的是,除非名称包含保留字或异常字符,否则什么都不做。所以:

UPDATE data
    SET name = 'target',
        number = 2
    WHERE name = 'target';

作为一般规则,只对字符串常量使用单引号。