You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

创建含外键的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 00:02:23