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 | 能 |
未经书面授权许可,任何个人和组织不得以任何形式转载、引用本站的任何内容。本站保留追究侵权者法律责任的权利。
评论
