Postgres使用最初计算的值添加列

时间:2018-03-19 16:58:01

标签: postgresql

我希望将新列添加到预先存在的表中,该表填充了值。新列将为NOT NULL,因此对于每个预先存在的行,它将需要一个值。

我正在寻找此列的初始值,这些值是根据列创建时表中的其他值计算的,而仅在列创建时

我有一个非常具体的用例,所以我不是在找一个解决方法。我将给出一个我正在寻找的非常简单的例子:

说我有这些数据:

CREATE TABLE numbers (
  value1 INTEGER NOT NULL,
  value2 INTEGER NOT NULL
);

INSERT INTO numbers(value1, value2) VALUES (10, 20), (2, 5);

我希望在value3表格上创建一个新列numbers,该列在创建时始终等于其对应的value1和{{1}的总和}列。

E.g:

value2

完成后,我想要以下数据:

ALTER TABLE numbers ADD COLUMN value3 INTEGER;

/* ... some more logic which calculates the initial values ... */

ALTER TABLE numbers
ALTER COLUMN value3 SET NOT NULL;

我稍后需要更新数据,可能会破坏关系-- The 3rd value will be the sum of the first 2 values SELECT * FROM numbers; value1 | value2 | value3 -------+--------+------- 10 | 20 | 30 2 | 5 | 7

value3 === (value1 + value2)

如何实施将计算出的初始值插入UPDATE numbers SET value3=9823 WHERE value1=10; 列的步骤?

提前致谢!

2 个答案:

答案 0 :(得分:0)

您有两种选择:

  1. 如果您需要将计算值存储在数据库中的触发器。

    CREATE OR REPLACE FUNCTION sum_columns()
    RETURNS trigger AS
    $BODY$
    BEGIN
    NEW.value := new.value1+new.value2;
    RETURN NEW;
    END;
    $BODY$
    LANGUAGE plpgsql;
    
    CREATE TRIGGER calculated_colum AFTER INSERT OR UPDATE ON numbers
    FOR EACH ROW EXECUTE PROCEDURE sum_columns();
    
  2. 如果您不需要将计算值存储在数据库中,则可以使用功能索引

    CREATE INDEX sum_columns_idx ON numbers ((value1+value2));
    

答案 1 :(得分:0)

我发现了一种相当简单的方法,下面添加了value3列,其中包含所需的初始值:

ALTER TABLE numbers ADD COLUMN value3 INTEGER; -- Exclude the NOT NULL constraint here

UPDATE numbers SET value3=value1+value2; -- Insert data with a regular UPDATE

ALTER TABLE numbers
ALTER COLUMN value3 SET NOT NULL; -- Now set the NOT NULL constraint

当postgres具有要应用于新列的计算的本机函数时,此方法很好。例如。在这种情况下,我想要的计算是“sum”,postgres通过+运算符执行此操作。对于postgres原生提供的操作,此方法将更加复杂。