Skip to content

SQLite - ALTER 命令

ALTER TABLE 命令用于修改现有表的结构(schema)。虽然 SQLite 在历史上对其限制较多,但现代版本提供了一套强大的操作,可以在不丢失数据的情况下演进您的数据库模式。

现代 SQLite 支持的操作包括:

  • RENAME TO:重命名整个表。
  • ADD COLUMN:向表中添加新列。
  • RENAME COLUMN:重命名现有列(SQLite 3.25.0+ 版本可用)。
  • DROP COLUMN:删除现有列(SQLite 3.35.0+ 版本可用)。

在使用 DROP COLUMN 或 RENAME COLUMN 等新特性之前,请务必检查您的 SQLite 版本(SELECT sqlite_version();)。

ALTER TABLE current_table_name RENAME TO new_table_name;

示例:ALTER TABLE COMPANY RENAME TO ORGANIZATIONS;

ALTER TABLE table_name ADD COLUMN new_column_definition;

提供 DEFAULT 值是一个最佳实践,尤其是在向已有数据的表中添加 NOT NULL 列时。

-- 添加一个带默认值的新列,以避免现有行中出现 NULL 值。
ALTER TABLE EMPLOYEES ADD COLUMN IS_ACTIVE INTEGER NOT NULL DEFAULT 1;
-- 注意:需要 SQLite 3.25.0 或更高版本。
ALTER TABLE table_name RENAME COLUMN current_column_name TO new_column_name;

示例:ALTER TABLE EMPLOYEES RENAME COLUMN SALARY TO ANNUAL_SALARY;

-- 注意:需要 SQLite 3.35.0 或更高版本。
ALTER TABLE table_name DROP COLUMN column_name;

示例:ALTER TABLE EMPLOYEES DROP COLUMN TEMP_NOTES;

对于较旧的 SQLite 版本或不支持的直接更改(如更改列的类型或约束),您必须执行手动迁移。过程如下:

  1. 启动事务:BEGIN TRANSACTION;
  2. 创建具有所需模式的新表:CREATE TABLE new_table (...)
  3. 将数据从旧表复制到新表:INSERT INTO new_table SELECT ... FROM old_table
  4. 删除旧表:DROP TABLE old_table
  5. 将新表重命名为原始名称:ALTER TABLE new_table RENAME TO old_table
  6. 重新创建旧表上的所有索引或触发器。
  7. 提交事务:COMMIT;
  • 事务:始终将模式更改包装在事务中(BEGIN/COMMIT)。这使得整个操作具有原子性(atomic),确保如果任何步骤失败,数据库都会回滚到其原始状态。
  • 依赖关系:请注意,重命名或删除表和列会破坏任何依赖于它们的视图、触发器或应用程序代码。这些必须手动更新。
  • 性能:在非常大的表上执行 ALTER TABLE 可能会很慢并锁定表,从而在迁移期间影响应用程序性能。