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

时间:2015-10-02 12:04:00

标签: postgresql

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

我知道,可以在 Microsoft SQL Server

中使用

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

是否可以在 PostgreSQL

3 个答案:

答案 0 :(得分:3)

您无法使用实际的DEFAULT进行此操作,但使用BEFORE触发器则无关紧要。

CREATE OR REPLACE FUNCTION whatever() RETURNS trigger LANGUAGE plpgsql AS $$
BEGIN
  NEW.onecol := NEW.othercol;
  RETURN NEW;
END;
$$;

CREATE TRIGGER whatever_tg
BEFORE INSERT ON mytable
FOR EACH ROW EXECUTE PROCEDURE whatever();

答案 1 :(得分:2)

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

这在Postgres中是可能的

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

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

将输出:

a | b
--+--
1 | 1
2 | 2
3 | 3

这似乎只适用于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;

如果您想要与serial列具有相同的定义,则只需要使序列属于该列:

alter sequence identdefault_a_seq owned by identdefault.a;

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

更广泛问题的答案" 如何将列B的默认值设置为A列中的值?"不幸的是:没有,你不能(见klin的评论)

答案 2 :(得分:1)

"你不能这样做"和postgres不能很好地融合在一起。几乎总有一种方法可以做到(无论是什么""原来是这样)。

问题更像是:你想怎么做?

一种方式,对DB-Admins来说很好:创建一个before-Trigger,在写入之前操纵新行。

如果您创建新列的规则非常有趣:转到其中一种嵌入式语言(例如perl)。

所以:有可能吗?当然是。