如何在SQLite3中重命名表?重命名操作反复报错如何解决?
SQLite3 重命名表报错的原因与解决方法
问题复现
错误操作与对应报错如下:
sqlite> rename table user to User; Error: near "rename": syntax error sqlite> alter table user rename to User; Error: there is already another table or index with this name: User sqlite> rename user to User; Error: near "rename": syntax error sqlite> RENAME user to User; Error: near "RENAME": syntax error sqlite> alter user rename to User; Error: near "user": syntax error sqlite> sqlite> ALTER user RENAME to User; Error: near "user": syntax error sqlite> alter table user rename to User; Error: there is already another table or index with this name: User sqlite> sp_rename user to User; Error: near "sp_rename": syntax error sqlite> sp_rename 'user' to 'User'; Error: near "sp_rename": syntax error sqlite> sp_rename 'user','User'; Error: near "sp_rename": syntax error sqlite> rename table user to User; Error: near "rename": syntax error
报错原因拆解
- 语法错误类报错(
rename开头、sp_rename开头、alter user开头的命令触发的报错)
SQLite 仅支持标准的ALTER TABLE语法重命名表,不支持其他数据库专属的RENAME直接重命名语法,也不支持SQL Server专属的sp_rename存储过程,不符合标准语法的操作都会触发语法错误。
SQLite重命名表的标准语法为:ALTER TABLE 旧表名 RENAME TO 新表名; - 同名对象存在报错(执行标准语法后提示
there is already another table or index with this name: User)
SQLite默认对标识符(表名、索引名等)大小写不敏感,系统会将user和User识别为同一个名称,因此仅修改表名大小写的操作会被判定为目标名称已存在。
解决方法
情况1:不需要强制区分表名大小写
SQLite默认大小写不敏感的特性下,查询时写SELECT * FROM user和SELECT * FROM User效果完全一致,不需要额外修改表名。
情况2:必须使用大写开头的User作为表名
可以通过显式指定标识符大小写的方式操作,步骤如下:
- 先查询确认当前没有其他和
user相关的重名索引:
SELECT name FROM sqlite_master WHERE type='index' AND LOWER(name) = 'user';
- 创建加双引号强制区分大小写的新表,结构和旧表完全一致:
CREATE TABLE "User" AS SELECT * FROM user WHERE 1=2;
- 复制旧表的所有数据到新表:
INSERT INTO "User" SELECT * FROM user;
- 确认新表数据无误后,删除旧的
user表:
DROP TABLE user;
注意:后续操作User表时如果需要严格区分大小写,也需要用双引号包裹表名。
内容的提问来源于stack exchange,提问作者Abinaya Geetha
相关产品推荐
相关产品推荐

