DBeaver使用SQLite创建数据库执行SQL报语法错误问题排查
SQLite 建表语法错误排查与修正
现存问题
你的SQL代码存在3类会直接触发报错的问题,另有2处易引发后续问题的笔误:
- 多余尾逗号:
School表最后一个字段Name TEXT NOT NULL后多写了逗号,SQL不允许字段定义列表末尾出现多余逗号,这是最直接的语法报错原因。 - 外键约束语法错误:你在三个子表中写的
CONSTRAINT pk_School_ID REFERENCES School(ID)不符合SQLite语法规范:- 外键约束必须通过
FOREIGN KEY (当前表字段名)明确指定当前表中用于关联的列,你没有定义对应关联字段,也没有在外键中声明关联列,数据库无法建立关联关系 - 约束名前缀
pk_是主键约束的通用命名前缀,外键约束建议使用fk_前缀避免混淆
- 外键约束必须通过
- 字段拼写笔误(不触发语法错误但会导致后续业务逻辑异常):
- 表示日期的字段你写为
start_data/end_data,data含义为数据,正确的日期拼写是date - 表示系数的字段
coefficent拼写错误,正确拼写为coefficient
- 表示日期的字段你写为
修正后可运行代码
执行前注意:SQLite默认关闭外键约束校验,需要先执行PRAGMA foreign_keys = ON;开启,外键关联规则才会生效。
PRAGMA foreign_keys = ON; CREATE TABLE School ( ID INTEGER PRIMARY KEY NOT NULL, Name TEXT NOT NULL ); CREATE TABLE events ( ID INTEGER PRIMARY KEY NOT NULL, SchoolID INTEGER NOT NULL, details TEXT NOT NULL, start_date TEXT NOT NULL, end_date TEXT NOT NULL, title TEXT NOT NULL, CONSTRAINT fk_events_SchoolID FOREIGN KEY (SchoolID) REFERENCES School(ID) ); CREATE TABLE CALENDAR ( ID INTEGER NOT NULL PRIMARY KEY, SchoolID INTEGER NOT NULL, title TEXT NOT NULL, details TEXT NOT NULL, start_date TEXT NOT NULL, end_date TEXT NOT NULL, subject INTEGER NOT NULL, CONSTRAINT fk_calendar_SchoolID FOREIGN KEY (SchoolID) REFERENCES School(ID) ); CREATE TABLE GRADES ( ID INTEGER PRIMARY KEY NOT NULL, SchoolID INTEGER NOT NULL, title TEXT NOT NULL, coefficient REAL NOT NULL, value REAL NOT NULL, date_time TEXT NOT NULL, Subject INTEGER NOT NULL, CONSTRAINT fk_grades_SchoolID FOREIGN KEY (SchoolID) REFERENCES School(ID) );
补充说明
如果你的业务设计中events/CALENDAR/GRADES表不需要直接关联School表,只需要删掉对应外键定义、移除新增的SchoolID字段即可;如果是关联其他业务表(比如科目表、用户表),只需要将外键关联的父表、当前表关联字段替换为实际业务对应的字段即可,核心是外键定义必须明确指定当前表的关联列。
内容的提问来源于stack exchange,提问作者Edoardo Pierezza
相关产品推荐
相关产品推荐

