修改表结构 (ALTER TABLE)
在软件开发过程中,随着需求的变化,我们经常需要修改数据库的表结构。相比于 MySQL 或 PostgreSQL,SQLite 的 ALTER TABLE 功能在历史上比较受限,但随着版本的更新,它已经越来越强大了。
在 SQLite 中,ALTER TABLE 命令主要用于以下四种操作:
- 重命名表 (
RENAME TO) - 重命名列 (
RENAME COLUMN) - 添加新列 (
ADD COLUMN) - 删除列 (
DROP COLUMN) (需要 SQLite 3.35.0+)
重命名表 (Rename Table)
当你觉得当前的表名不再合适时,可以使用此命令。
语法:
示例:
将 users 表重命名为 customers:
提示: 重命名表后,SQLite 会自动更新所有引用该表的索引和触发器,但 视图 (Views) 或应用程序中的 SQL 语句需要你手动更新。
重命名列 (Rename Column)
要求版本:SQLite 3.25.0 +
用于修正拼写错误或使字段名更具描述性。
语法:
示例:
将 customers 表中的 addr 字段改为 address:
添加新列 (Add Column)
这是最常用的操作之一。向现有表中追加一个新的字段。
语法:
示例:
给 customers 表增加一个 email 字段:
给 orders 表增加一个带有默认值的 status 字段:
限制与注意事项
- 新增的列总是添加在表的最后面。
- 新增列不能是
PRIMARY KEY或UNIQUE(除非是表重建方式)。 - 如果声明了
NOT NULL,必须提供一个DEFAULT值(除非表是空的)。
删除列 (Drop Column)
要求版本:SQLite 3.35.0 +
在旧版本的 SQLite 中,删除列是非常麻烦的(需要重建表)。但在 3.35.0 版本之后,原生支持了删除列。
语法:
示例:
删除 customers 表中的 fax_number 字段:
重要提示: 删除列后,数据库文件的大小不会立即变小。SQLite 只是标记该空间可用。如果你想释放磁盘空间,需要执行
VACUUM
修改列类型或约束
SQLite 的 ALTER TABLE 命令 不支持 以下操作:
- 修改现有列的数据类型(例如从
TEXT变为INTEGER)。 - 修改列的约束(例如添加
UNIQUE或移除NOT NULL)。 - 改变列的顺序。
如果你需要做这些操作,或者你的 SQLite 版本低于 3.35 却想删除列,必须使用 “重建表” (Recreate Table) 的策略。
12 步标准操作流程(事务安全):
假设我们要修改 users 表:
- 把
age字段的数据类型从TEXT改为INTEGER - 为
email字段添加唯一约束 - 重建索引
- 重建触发器
- 保持外键约束
总结 / Cheat Sheet
建议
- 备份!备份!备份! 在对生产环境数据库执行
ALTER TABLE(尤其是删除列或重建表)之前,务必备份你的.db文件。 - 检查版本: 使用
SELECT sqlite_version();查看你当前的 SQLite 版本,确保支持你想要执行的命令。 - 工具推荐: 如果你不喜欢写复杂的 SQL,可以使用 DB Browser for SQLite 等可视化工具,它们会在后台自动帮你执行上述的“重建表”脚本。

