从 sqlite 表中选择记录时出错
Posted
技术标签:
【中文标题】从 sqlite 表中选择记录时出错【英文标题】:Error in select record from sqlite table 【发布时间】:2016-06-27 09:05:40 【问题描述】:我在 SQLITE 中有一个表:
CREATE TABLE "INVENTORY" (
"product" VARCHAR NOT NULL,
"version" VARCHAR NOT NULL,
"productionDate" VARCHAR NOT NULL,
"order" VARCHAR NOT NULL,
"AA" VARCHAR NOT NULL,
"quantity" INTEGER,
"location" INTEGER,
"barcode" VARCHAR,
PRIMARY KEY ("product", "version", "productionDate", "AA", "order")
);
当我尝试选择一条记录(它存在)时:
SELECT * FROM INVENTORY
WHERE (product='25120171' AND version='02' AND productionDate='091014' AND AA='001' AND order='4420')
我收到一个错误
SQLiteManager:可能的 SQL 语法错误:SELECT * FROM INVENTORY WHERE (product='25120171' AND version='02' AND productionDate='091014' AND AA='001' AND order='4420') [“order”附近:语法错误] 异常 名称:NS_ERROR_FAILURE 异常消息:组件返回失败 代码:0x80004005(NS_ERROR_FAILURE) [mozIStorageConnection.createStatement]
如果我从选择查询中删除AND order='4420'
:
SELECT * FROM INVENTORY
WHERE (product='25120171' AND version='02' AND productionDate='091014' AND AA='001');
它有效。我找不到错误在哪里...
【问题讨论】:
【参考方案1】:使用 order 作为列名可能是导致错误的原因。
As the doc says
SQL 标准指定了大量的关键字,这些关键字不能用作表、索引、列、数据库、用户定义函数、排序规则、虚拟表模块或任何其他命名对象的名称。关键字列表太长了,很少有人能全部记住。对于大多数 SQL 代码,最安全的选择是永远不要使用任何英语单词作为用户定义对象的名称。
order
就是其中之一。
您可以重新编写查询以转义列名:
SELECT * FROM INVENTORY
WHERE (product='25120171' AND version='02' AND productionDate='091014' AND AA='001' AND `order`='4420')
【讨论】:
以上是关于从 sqlite 表中选择记录时出错的主要内容,如果未能解决你的问题,请参考以下文章