创建含外键的SQLite表时遇语法错误:期望<table constraint>却获'quantity'
问题解决:SQLite创建带外键的表时出现「expected, got 'quantity'」错误
错误原因是你在创建transactions表的SQL语句中,外键约束的位置不符合SQLite语法规范:你把FOREIGN KEY定义插在了列声明的中间(userID和quantity之间),SQL解析器处理到这里时会认为列定义已经结束,后续的quantity TEXT就变成了非法语法,从而抛出错误。
修正后的代码
把外键约束移到所有列声明的后面即可,以下是两种可行的写法:
写法一(基础外键约束)
public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE user(ID INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT, password TEXT, email TEXT, phone TEXT)"); db.execSQL("CREATE TABLE transactions(TRANSACTIONS_ID INTEGER PRIMARY KEY AUTOINCREMENT, userID INTEGER, quantity TEXT, FOREIGN KEY (userID) REFERENCES user(ID))"); }
写法二(带约束名的外键,便于后续维护)
public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE user(ID INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT, password TEXT, email TEXT, phone TEXT)"); db.execSQL("CREATE TABLE transactions(TRANSACTIONS_ID INTEGER PRIMARY KEY AUTOINCREMENT, userID INTEGER, quantity TEXT, CONSTRAINT fk_trans_user FOREIGN KEY (userID) REFERENCES user(ID))"); }
补充说明
SQLite默认关闭外键约束,若需要外键生效,需在数据库连接时开启支持,可在onOpen方法中添加:
@Override public void onOpen(SQLiteDatabase db) { super.onOpen(db); db.setForeignKeyConstraintsEnabled(true); }
内容的提问来源于stack exchange,提问作者suppatra
相关产品推荐
相关产品推荐

