如何将列B的默认值设置为A列中的值?
我知道,可以在 Microsoft SQL Server :
中使用http://www.ideaexcursion.com/2010/04/19/default-column-value-to-identity-of-different-column/
是否可以在 PostgreSQL ?
答案 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)。
所以:有可能吗?当然是。