【问题标题】:How can I set a default for column B to be the value in column A in PostgreSQL?如何将 B 列的默认值设置为 PostgreSQL 中 A 列的值?
【发布时间】:2018-04-27 10:20:45
【问题描述】:

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

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

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

在 PostgreSQL 中可以吗?

【问题讨论】:

标签: postgresql


【解决方案1】:

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

这在 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 列中的值?”的答案是:否,您可以't(见克林的评论)

【讨论】:

    【解决方案2】:

    您无法使用实际的 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();
    

    【讨论】:

      【解决方案3】:

      “你不能那样做”和 postgres 不能很好地结合在一起。几乎总有一种方法可以做到这一点(无论“那个”最终是什么)。

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

      对 DB-Admins 来说很好的一种方法是:创建一个 before-Trigger,在写入新行之前对其进行操作。

      如果您创建新列的规则非常花哨:请使用其中一种嵌入式语言(如 perl)。

      那么:有可能吗?当然是。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-10-10
        • 2016-08-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多