0Pricing
SQL Academy · 课时

零停机重命名列

添加新列、双写、回填、切换读取、删除旧列——这是规范的零停机重命名模式

零停机重命名列 是 CoddyKit 上的免费 SQL Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 SQL Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 SQL Academy 课程共包含 4 节课。

朴素方案会失效

ALTER TABLE t RENAME COLUMN a TO b; 只修改元数据 — 速度很快。但应用程序依赖列 "a";重命名后,所有读取 "a" 的查询都会失效。

策略:扩展 → 迁移 → 收缩

经典的零停机模式:

  1. 扩展 — 添加新列,不删除旧列
  2. 让应用程序在一段时间内同时写入两列
  3. 迁移 — 将历史数据回填到新列
  4. 将读取切换到新列
  5. 收缩 — 删除旧列

分步操作:将 user_name 重命名为 full_name

详细步骤:

步骤 1 — 添加新列

在线完成(在 PG 11+ 中使用常量 DEFAULT 时仅修改元数据):

ALTER TABLE users ADD COLUMN full_name VARCHAR(100);

步骤 2 — 双写

部署同时写入两列的代码:

// App writes to both:
UPDATE users SET user_name = $1, full_name = $1 WHERE id = $2;
INSERT INTO users (..., user_name, full_name) VALUES (..., $name, $name);

步骤 3 — 回填

分批复制历史数据:

UPDATE users SET full_name = user_name
WHERE full_name IS NULL
  AND id IN (
    SELECT id FROM users WHERE full_name IS NULL LIMIT 10000
  );
-- Run in a loop until 0 rows affected.

步骤 4 — 添加 NOT NULL(在线)

回填完成后,安全地强制执行 NOT NULL:

ALTER TABLE users
  ADD CONSTRAINT fn_not_null CHECK (full_name IS NOT NULL) NOT VALID;
ALTER TABLE users VALIDATE CONSTRAINT fn_not_null;
ALTER TABLE users ALTER COLUMN full_name SET NOT NULL;
ALTER TABLE users DROP CONSTRAINT fn_not_null;

步骤 5 — 切换读取

部署读取 full_name 而不是 user_name 的代码。

步骤 6 — 停止双写

部署只写入 full_name 的代码。

步骤 7 — 删除旧列

在线完成(仅修改元数据):

ALTER TABLE users DROP COLUMN user_name;

取舍:时间与复杂度

一次简单的重命名会变成持续数天或数周的 4–7 次部署。对于非简单的生产系统,这是唯一安全的路径。

重命名表

模式类似,但难度更高。使用 VIEW 作为临时别名:

ALTER TABLE old_name RENAME TO new_name;
CREATE VIEW old_name AS SELECT * FROM new_name;
-- Deploy new code. Then drop the view.

回顾

零停机的列重命名遵循扩展 → 迁移 → 收缩。

  • 添加新列
  • 双写
  • 分批回填
  • 切换读取
  • 停止旧列写入
  • 删除旧列

快速检查

向旧列和新列同时部署双写后,紧接着应该进入哪个阶段?

常见问题解答

「零停机重命名列」课时是免费的吗?

是的 — 「零停机重命名列」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 SQL Academy 课程的其余内容,请升级到 CoddyKit PRO。 SQL Academy 课程共包含 4 节课。

「零停机重命名列」这节课中我会学到什么?

添加新列、双写、回填、切换读取、删除旧列——这是规范的零停机重命名模式 你通过在浏览器中直接运行的动手代码来练习 SQL Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 SQL Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 SQL Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「零停机重命名列」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 SQL Academy 课中编写并运行代码吗?

能。每节 SQL Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 在线迁移:ALTER TABLE 为何会加锁
  2. 并发创建索引(CREATE INDEX CONCURRENTLY)
  3. 零停机重命名列
  4. 工具:Flyway、Liquibase、Sqitch
← 返回 SQL Academy