将具有默认值的列添加到 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,这个操作可以用两条语句完成。
- 添加具有旧默认值的列
ALTER TABLE my_table ADD COLUMN description varchar(100) DEFAULT 'A1';
- 修改列以使用不同的默认值
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 不需要多次重写。但是在这里,它根本不需要重写。
问题:
是否有 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,这个操作可以用两条语句完成。
- 添加具有旧默认值的列
ALTER TABLE my_table ADD COLUMN description varchar(100) DEFAULT 'A1';
- 修改列以使用不同的默认值
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 不需要多次重写。但是在这里,它根本不需要重写。