如何将 B 列的默认值设置为 PostgreSQL 中 A 列中的值?

And*_*riy 3 postgresql

如何将 B 列的默认值设置为 A 列中的值?

我知道,在Microsoft SQL Server 中是可能的:

http://www.ideaexcursion.com/2010/04/19/default-column-value-to-identity-of-different-column/

PostgreSQL 中可能吗?

a_h*_*ame 5

链接示例显示如何使用同一表的标识列的值初始化一列。

这在 Postgres 中是可能的

create table identdefault
(
    a serial not null,
    b int not null default currval('identdefault_a_seq')
);
Run Code Online (Sandbox Code Playgroud)

serial将在后台创建一个已命名tablename_column_seq的序列,因此我们知道该序列identdefault.a将被命名identdefault_a_seq,我们可以通过该currval函数访问最后一个值。

跑步:

insert into identdefault default values;
insert into identdefault default values;
insert into identdefault default values;

select *
from identdefault
Run Code Online (Sandbox Code Playgroud)

将输出:

a | b
--+--
1 | 1
2 | 2
3 | 3
Run Code Online (Sandbox Code Playgroud)

这似乎仅适用于 Postgres 9.4,当我尝试使用 9.3(在 SQLFiddle 上)时出现错误。但在这种情况下,它也是可能的——你只是不能使用“快捷方式”,serial但需要明确地创建序列:

create sequence identdefault_a_seq;

create table identdefault
(
    a int not null default nextval('identdefault_a_seq'),
    b int not null default currval('identdefault_a_seq')
);


insert into identdefault default values;
insert into identdefault default values;
insert into identdefault default values;
Run Code Online (Sandbox Code Playgroud)

如果你想和serial列有相同的定义,你只需要让序列属于列:

alter sequence identdefault_a_seq owned by identdefault.a;
Run Code Online (Sandbox Code Playgroud)

SQLFiddle:http ://sqlfiddle.com/#!15/0aa34/1


更广泛的问题“我如何将 B 列的默认值设置为 A 列中的值? ”的答案很遗憾:,你不能(见 klin 的评论)