Flutter使用sqflite重命名/删除列时出现near "COLUMN"语法错误
报错原因
- SQLite版本不支持对应语法:
RENAME COLUMN语法仅在 SQLite 3.25.0 及以上版本可用- 删除列的正确关键字是
DROP而非你写的DELETE,DROP COLUMN语法仅在 SQLite 3.35.0 及以上版本可用 - Flutter 默认调用系统内置的 SQLite,安卓低版本内置的 SQLite 版本普遍低于 3.25.0,因此触发语法报错
- 语法细节错误:你尝试给列名加单引号的写法有误,SQLite 会将单引号包裹的内容识别为字符串常量,而非列名,正确做法是要么不加引号,要么用反引号/双引号包裹列名。
解决方案
方案1:全版本兼容方案(最稳妥,无版本依赖)
采用 SQLite 官方推荐的传统表结构修改流程,适配所有 SQLite 版本,以重命名 ayet 表的 User_Name 列为 New_Name 为例:
- 第一步:创建符合新结构的临时表
CREATE TABLE IF NOT EXISTS ayet_temp ( id INTEGER, New_Name INTEGER DEFAULT(0), PRIMARY KEY(id AUTOINCREMENT) );
- 第二步:迁移原表数据到临时表
INSERT INTO ayet_temp (id, New_Name) SELECT id, User_Name FROM ayet;
- 第三步:删除原表
DROP TABLE IF EXISTS ayet;
- 第四步:将临时表重命名为原表名
ALTER TABLE ayet_temp RENAME TO ayet;
如果是要删除 User_Name 列,仅需要在创建临时表时不添加该列,迁移数据时也不查询该列即可。
方案2:升级SQLite版本
如果你不需要兼容过低的系统版本,可以使用自带高版本 SQLite 的 Flutter 依赖包(如 sqflite_common_ffi),确保运行环境的 SQLite 版本满足要求后,使用正确语法操作即可:
- 重命名列语法:
ALTER TABLE ayet RENAME COLUMN User_Name TO New_Name;
- 删除列语法:
ALTER TABLE ayet DROP COLUMN User_Name;
内容的提问来源于stack exchange,提问作者Hakim Hüseyin
相关产品推荐
相关产品推荐

