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

Tms*_*s91 6 sql postgresql ddl

问题
是否有一个 postgres 查询可以将新列添加到现有表中,并自动为该表的所有行填充特定值的列,比如说,在"A1"创建列时仅一次,这样我仍然可以将列的 DEFAULT 值设置为另一个值,比如说"B2"

需要明确的是,我正在寻找这样的东西:

鉴于my_table

name   |   work
------------------------
bob    |  fireman
carl   |  teacher
alice  |  policeman
Run Code Online (Sandbox Code Playgroud)

我的查询

ALTER TABLE my_table 
ADD COLUMN description varchar(100) 
DEFAULT "B2"
COMMAND_I_D_WISH_TO_KNOW "A1";
Run Code Online (Sandbox Code Playgroud)

变成my_table

name   |   work       | description
-------------------------------------
bob    |  fireman     | "A1"
carl   |  teacher     | "A1"
alice  |  policeman   | "A1"
Run Code Online (Sandbox Code Playgroud)

这样如果之后我运行查询

INSERT INTO my_table(name, work)
VALUES karen, developer;
Run Code Online (Sandbox Code Playgroud)

my_tables变成

name   |   work       | description
-------------------------------------
bob    |  fireman     | "A1"
carl   |  teacher     | "A1"
alice  |  policeman   | "A1"
karen  |  developer   | "B2"
Run Code Online (Sandbox Code Playgroud)

jja*_*nes 8

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

ALTER TABLE my_table 
  ADD COLUMN description varchar(100) DEFAULT 'A1', 
  ALTER COLUMN description SET DEFAULT 'B2';
Run Code Online (Sandbox Code Playgroud)

我已经验证它DROP DEFAULT不能在添加列的同一命令中工作,与SET DEFAULT NULL. 我不认为它确实有一个不工作的原因,它只是碰巧以错误的顺序执行它们,并且没有人费心强迫它以正确的顺序执行。(也许是因为没有人测试过那个确切的东西,所以意识到它坏了)

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


ggo*_*don 3

参考最新的文档,这个操作可以使用两条语句来完成。

  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');
Run Code Online (Sandbox Code Playgroud)

查询#1

select * from my_table;
Run Code Online (Sandbox Code Playgroud)
姓名 工作
鲍勃 消防队员
卡尔 老师
爱丽丝 警察

查询#2

ALTER TABLE my_table 
ADD COLUMN description varchar(100) 
DEFAULT 'A1';
Run Code Online (Sandbox Code Playgroud)

没有可显示的结果。


查询#3

select * from my_table;
Run Code Online (Sandbox Code Playgroud)
姓名 工作 描述
鲍勃 消防队员 A1
卡尔 老师 A1
爱丽丝 警察 A1

查询#4

ALTER TABLE my_table 
ALTER COLUMN description SET DEFAULT 'B2';
Run Code Online (Sandbox Code Playgroud)

没有可显示的结果。


查询#5

INSERT INTO my_table("name", "work")
VALUES ('karen', 'developer');
Run Code Online (Sandbox Code Playgroud)

没有可显示的结果。


查询#6

select * from my_table;
Run Code Online (Sandbox Code Playgroud)
姓名 工作 描述
鲍勃 消防队员 A1
卡尔 老师 A1
爱丽丝 警察 A1
凯伦 开发商 B2

查看 DB Fiddle 上的工作演示

让我知道这是否适合您。