将 postgres 列设置为默认值不为空而不更新

kag*_*ag0 5 sql postgresql ddl alter-table

有没有一种方法可以not null在一个语句中向列添加约束并用默认值替换所有现有的空值?

alter table t
alter column c set default 0,
alter column c set not null;
Run Code Online (Sandbox Code Playgroud)

似乎不起作用,给出错误:

column "c" contains null values
Run Code Online (Sandbox Code Playgroud)

Erw*_*ter 6

其实,是。也很简单:

ALTER TABLE t
  ALTER COLUMN c TYPE int USING (COALESCE(c, 0))
, ALTER COLUMN c SET DEFAULT 0
, ALTER COLUMN c SET NOT NULL;
Run Code Online (Sandbox Code Playgroud)

db<>在这里摆弄

你只需要思考一下。我们将类型从 更改intint,因此没有实际更改。但它允许我们插入发挥魔力的USING子句。

  • ⚠️这种方法**锁定整个表**直到完成。如果可以的话,最好使用较慢的“UPDATE”,但不加锁。 (2认同)