我试图在我制作的示例表上执行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';
有谁知道为什么会发生这种情况,或者我如何处理引号以防止带有空格的假设列名称?
答案 0 :(得分:1)
您正在测试字符串'name'
是否等于字符串'target'
。
您应该为列名使用双引号:
UPDATE data SET "name"='target', "number"=3 WHERE "name"='target';
答案 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';
作为一般规则,只对字符串常量使用单引号。