DBeaver执行SQLite建表语句报fk_GRADES_ID附近语法错误
报错原因
- 外键定义语法不符合SQLite规则:SQLite表级外键的标准结构为
[CONSTRAINT 自定义约束名] FOREIGN KEY (子表关联字段) REFERENCES 父表名(父表关联字段)。你写的FOREIGN KEY fk_xxx_ID REFERENCES School(ID)存在两处语法错误:一是自定义外键名前缺少CONSTRAINT关键字,二是FOREIGN KEY后没有用括号指定当前表中用来做关联的字段,解析器读到fk_GRADES_ID位置时无法识别语法,直接抛出错误。 - 关联字段缺失:三个子表
events、CALENDAR、GRADES中都没有定义存储School表ID的字段,外键关联没有对应的承载字段,逻辑不成立。 - 语句未闭合:最后一个
GRADES表的建表语句末尾缺少右括号和结束分号,会加剧语法解析错误。
修正方案
- 给每个需要关联School表的子表新增专门的外键字段(示例中用
school_id命名,可根据业务需求调整)。 - 按照SQLite标准语法调整外键定义,补全缺失的语句闭合符。
修正后可正常执行的SQL代码如下:
-- 开启外键校验(SQLite默认关闭,需要外键生效时执行) PRAGMA foreign_keys = ON; CREATE TABLE School ( ID INTEGER PRIMARY KEY , Name TEXT NOT NULL ); CREATE TABLE events ( ID INTEGER PRIMARY KEY , details TEXT NOT NULL, start_data TEXT NOT NULL, end_data TEXT NOT NULL, title TEXT NOT NULL, school_id INTEGER NOT NULL, CONSTRAINT fk_events_ID FOREIGN KEY (school_id) REFERENCES School(ID) ); CREATE TABLE CALENDAR ( ID INTEGER PRIMARY KEY, title TEXT NOT NULL, details TEXT NOT NULL, start_data TEXT NOT NULL, end_data TEXT NOT NULL, subject INTEGER NOT NULL, school_id INTEGER NOT NULL, CONSTRAINT fk_CALENDAR_ID FOREIGN KEY (school_id) REFERENCES School(ID) ); CREATE TABLE GRADES ( ID INTEGER PRIMARY KEY , title TEXT NOT NULL, coefficent REAL NOT NULL, value REAL NOT NULL, date_time TEXT NOT NULL, Subject INTEGER NOT NULL, school_id INTEGER NOT NULL, CONSTRAINT fk_GRADES_ID FOREIGN KEY (school_id) REFERENCES School(ID) );
- 如果不需要自定义外键名,可以省略
CONSTRAINT fk_xxx_ID部分,SQLite会自动生成默认约束名。 - 如果业务上不需要子表和School表做关联,直接删除所有外键定义语句即可正常运行。
内容的提问来源于stack exchange,提问作者Edoardo Pierezza
相关产品推荐
相关产品推荐

