小编Vov*_*ova的帖子

在没有表级锁的情况下在 postgresql 中添加具有默认值的列

有这样的问题 - 超过 2000 万行的表。

当我使用默认值添加新列时 - postgresql 锁定表超过 40 分钟,因此我的应用程序此时停止工作。

所以代替

ALTER TABLE "test" ADD COLUMN "field" boolean DEFAULT True NOT NULL;
Run Code Online (Sandbox Code Playgroud)

我愿意

ALTER TABLE "test" ADD COLUMN "field" boolean NULL;
ALTER TABLE "test" ALTER COLUMN "field" SET DEFAULT true;
Run Code Online (Sandbox Code Playgroud)

之后每个新行默认为 true,所以现在我需要更新 2000 万个当前行。我分批更新它们:

WITH cte AS (
SELECT id as pk
FROM "test"
WHERE  "field" is null
LIMIT  10000
)
UPDATE "test" table_
SET "field" = true
FROM   cte
WHERE  table_.id = cte.pk
Run Code Online (Sandbox Code Playgroud)

之后我做

ALTER TABLE "test" ALTER …
Run Code Online (Sandbox Code Playgroud)

postgresql performance alter-table postgresql-performance

4
推荐指数
1
解决办法
7593
查看次数