一、问题及原因

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 能