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)
是的,您可以通过在一个 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命令来执行它们。如果您担心有人可能“看到”处于中间状态的表,您可以在单个事务中完成这两项操作。然后锁在中间不会被释放,所以没有人可以看到它。在一个命令中执行多个操作的真正优点是不需要多次重写表。但在这里,它根本不需要重写。
参考最新的文档,这个操作可以使用两条语句来完成。
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');
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 |
让我知道这是否适合您。
| 归档时间: |
|
| 查看次数: |
14672 次 |
| 最近记录: |