将具有默认值的列添加到 postgresql 中现有的 table

Add a column with a default value to an existing table in postgresql

问题:
是否有 postgres 查询将新列添加到现有 table 并自动为 table 的所有行填充具有特定值的列,比方说 "A1"仅一次,因为创建了列,所以我仍然可以将列的默认值设置为另一个值,比方说"B2"?

明确一点,我正在寻找这样的东西:

给定 my_table:

name   |   work
------------------------
bob    |  fireman
carl   |  teacher
alice  |  policeman

我的查询

ALTER TABLE my_table 
ADD COLUMN description varchar(100) 
DEFAULT "B2"
COMMAND_I_D_WISH_TO_KNOW "A1";

my_table变为

name   |   work       | description
-------------------------------------
bob    |  fireman     | "A1"
carl   |  teacher     | "A1"
alice  |  policeman   | "A1"

所以如果之后我运行查询

INSERT INTO my_table(name, work)
VALUES karen, developer;

my_tables 变为

name   |   work       | description
-------------------------------------
bob    |  fireman     | "A1"
carl   |  teacher     | "A1"
alice  |  policeman   | "A1"
karen  |  developer   | "B2"

参考最近的docs,这个操作可以用两条语句完成。

  1. 添加具有旧默认值的列

ALTER TABLE my_table ADD COLUMN description varchar(100) DEFAULT 'A1';

  1. 修改列以使用不同的默认值

ALTER TABLE my_table ALTER COLUMN description SET DEFAULT 'B2'

下面包含了完整的可复制示例:

CREATE TABLE my_table (
  "name" VARCHAR(5),
  "work" VARCHAR(9)
);

INSERT INTO my_table
  ("name", "work")
VALUES
  ('bob', 'fireman'),
  ('carl', 'teacher'),
  ('alice', 'policeman');

查询#1

select * from my_table;
name work
bob fireman
carl teacher
alice policeman

查询#2

ALTER TABLE my_table 
ADD COLUMN description varchar(100) 
DEFAULT 'A1';

没有要显示的结果。


查询 #3

select * from my_table;
name work description
bob fireman A1
carl teacher A1
alice policeman A1

查询 #4

ALTER TABLE my_table 
ALTER COLUMN description SET DEFAULT 'B2';

没有要显示的结果。


查询#5

INSERT INTO my_table("name", "work")
VALUES ('karen', 'developer');

没有要显示的结果。


查询#6

select * from my_table;
name work description
bob fireman A1
carl teacher A1
alice policeman A1
karen developer B2

View working demo on DB Fiddle

让我知道这是否适合你。

是的,您可以通过在一个 ALTER 中使用两个操作来做到这一点。

ALTER TABLE my_table 
  ADD COLUMN description varchar(100) DEFAULT 'A1', 
  ALTER COLUMN description SET DEFAULT 'B2';

我已确认 DROP DEFAULT 与添加列的命令不同,与 SET DEFAULT NULL 不同。我不认为它真的没有理由不工作,它只是碰巧以错误的顺序执行它们以使其工作,并且没有人费心强迫它以正确的顺序执行。 (也许是因为甚至没有人测试过那个确切的东西,所以意识到它坏了)

您始终可以在不同的 ALTER 命令中执行它们。如果您担心有人可能会“看到”处于中间状态的 table,您可以在一个事务中完成这两项操作。然后锁不会在两者之间释放,所以没有人可以看到它。在一个命令中执行多项操作的真正优势在于 table 不需要多次重写。但是在这里,它根本不需要重写。