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

Flutter Sqflite创建多表报错:transaction表语法错误求解决方案

问题解决:Sqflite创建transaction表语法错误

错误原因

transaction是SQLite的保留关键字,直接将其用作表名时,SQLite会将其识别为SQL语句的一部分,而非普通表名,从而触发语法错误。

解决方案

提供两种可行的解决方式:

方式1:用反引号包裹表名

在SQL语句中,用反引号(`)将transaction包裹,强制SQLite将其视为普通标识符:

static Future<void> createTables(sql.Database database) async {
    await database.execute("""CREATE TABLE cart (
      id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
      food TEXT,
      price INTEGER,
      qty INTEGER,
      cashier TEXT,
      createdAt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
    ) """);
    await database.execute("""CREATE TABLE `transaction` (
      id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
      no_nota TEXT,
      food TEXT,
      price INTEGER,
      qty INTEGER,
      cashier TEXT,
      createdAt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
    ) """);
}

方式2:修改表名(推荐)

直接更换表名,避开SQLite的保留关键字,比如使用复数形式transactions或更具描述性的transaction_records:

static Future<void> createTables(sql.Database database) async {
    await database.execute("""CREATE TABLE cart (
      id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
      food TEXT,
      price INTEGER,
      qty INTEGER,
      cashier TEXT,
      createdAt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
    ) """);
    await database.execute("""CREATE TABLE transactions (
      id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
      no_nota TEXT,
      food TEXT,
      price INTEGER,
      qty INTEGER,
      cashier TEXT,
      createdAt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
    ) """);
}

方案对比

  • 方式1无需修改其他引用该表的代码,但可读性略差;
  • 方式2更符合数据库命名规范,能避免后续潜在的关键字冲突问题,但需要同步修改所有涉及该表的查询语句。

内容的提问来源于stack exchange,提问作者Stepanus Ryan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 17:52:40