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
相关产品推荐
相关产品推荐

