SQLite中使用关键字作为列名称导致报错
一、问题及原因
CREATE TABLE IF NOT EXISTS order_record (id INTEGER PRIMARY KEY AUTOINCREMENT,order_id,stock_code,order_type,limit,creat_time);
尝试使用上边的语句创建一个名为order_record
的表时遇到报错,报错信息如下:
near “limit”: syntax error
出现这个报错,是因为直接在列名称中使用了SQLite的关键字limit
,导致解析器混淆了关键字(Keyword)与标识符(Identifier)。经过测试,在已知的146个保留字中,有89个能直接作为名称使用,而另外57个直接作为名称使用则会引起报错(测试结果详见附录)。
关于SQLite的关键字,可以参考SQLite官网 - Keywords。
二、解决方法
1、避免使用关键字作为名称
SQLite官方不建议使用关键字作为表、索引、列、数据库、用户定义函数、排序规则、虚拟表模块等的名称。
因为SQLite保留的关键字较多,且随着SQLite未来的更新升级,保留的关键字可能会更多。为了避免潜在的冲突,官方建议尽量不要直接使用任何单个英文单词作为名称。
2、为名称添加引号
在标准的SQLite语法中,可以通过为名称添加双引号来表示标识符。示例:"limit"
。
此外,还可使用方括号、反单引号来表示标识符。示例:[limit]
、`limit`
。
需要注意的是,方括号和反单引号并不属于标准的SQLite语法,而是对MS Access、SQL Server、MySQL的兼容。在未来的SQLite版本中,可能将不再提供对非标准语法的兼容支持。
附录:关键字列表
关键字 | 能否直接作为名称 |
---|---|
ABORT | 能 |
ACTION | 能 |
ADD | 否 |
AFTER | 能 |
ALL | 否 |
ALTER | 否 |
ALWAYS | 能 |
ANALYZE | 能 |
AND | 否 |
AS | 否 |
ASC | 能 |
ATTACH | 能 |
AUTOINCREMENT | 否 |
BEFORE | 能 |
BEGIN | 能 |
BETWEEN | 否 |
BY | 能 |
CASCADE | 能 |
CASE | 否 |
CAST | 能 |
CHECK | 否 |
COLLATE | 否 |
COLUMN | 能 |
COMMIT | 否 |
CONFLICT | 能 |
CONSTRAINT | 否 |
CREATE | 否 |
CROSS | 能 |
CURRENT | 能 |
CURRENT_DATE | 能 |
CURRENT_TIME | 能 |
CURRENT_TIMESTAMP | 能 |
DATABASE | 能 |
DEFAULT | 否 |
DEFERRABLE | 否 |
DEFERRED | 能 |
DELETE | 否 |
DESC | 能 |
DETACH | 能 |
DISTINCT | 否 |
DO | 能 |
DROP | 否 |
EACH | 能 |
ELSE | 否 |
END | 能 |
ESCAPE | 否 |
EXCEPT | 否 |
EXCLUDE | 能 |
EXCLUSIVE | 能 |
EXISTS | 否 |
EXPLAIN | 能 |
FAIL | 能 |
FILTER | 能 |
FIRST | 能 |
FOLLOWING | 能 |
FOR | 能 |
FOREIGN | 否 |
FROM | 否 |
FULL | 能 |
GENERATED | 能 |
GLOB | 能 |
GROUP | 否 |
GROUPS | 能 |
HAVING | 否 |
IF | 能 |
IGNORE | 能 |
IMMEDIATE | 能 |
IN | 否 |
INDEX | 否 |
INDEXED | 能 |
INITIALLY | 能 |
INNER | 能 |
INSERT | 否 |
INSTEAD | 能 |
INTERSECT | 否 |
INTO | 否 |
IS | 否 |
ISNULL | 否 |
JOIN | 否 |
KEY | 能 |
LAST | 能 |
LEFT | 能 |
LIKE | 能 |
LIMIT | 否 |
MATCH | 能 |
MATERIALIZED | 能 |
NATURAL | 能 |
NO | 能 |
NOTHING | 否 |
NOTNULL | 否 |
NULL | 否 |
NULLS | 能 |
OF | 能 |
OFFSET | 能 |
ON | 否 |
OR | 否 |
ORDER | 否 |
OTHERS | 能 |
OUTER | 能 |
OVER | 能 |
PARTITION | 能 |
PLAN | 能 |
PRAGMA | 能 |
PRECEDING | 能 |
PRIMARY | 否 |
QUERY | 能 |
RAISE | 能 |
RANGE | 能 |
RECURSIVE | 能 |
REFERENCES | 否 |
REGEXP | 能 |
REINDEX | 能 |
RELEASE | 能 |
RENAME | 能 |
REPLACE | 能 |
RESTRICT | 能 |
RETURNING | 否 |
RIGHT | 能 |
ROLLBACK | 能 |
ROW | 能 |
ROWS | 能 |
SAVEPOINT | 能 |
SELECT | 否 |
SET | 否 |
TABLE | 否 |
TEMP | 能 |
TEMPORARY | 能 |
THEN | 否 |
TIES | 能 |
TO | 否 |
TRANSACTION | 否 |
TRIGGER | 能 |
UNBOUNDED | 能 |
UNION | 否 |
UNIQUE | 否 |
UPDATE | 否 |
USING | 否 |
VACUUM | 能 |
VALUES | 否 |
VIEW | 能 |
VIRTUAL | 能 |
WHEN | 否 |
WHERE | 否 |
WINDOW | 能 |
WITH | 能 |
WITHOUT | 能 |
未经书面授权许可,任何个人和组织不得以任何形式转载、引用本站的任何内容。本站保留追究侵权者法律责任的权利。
评论