Postgres 添加带有初始计算值的列

Ger*_*ica 7 postgresql

我正在寻找向填充有值的预先存在的表添加一个新列。新列将是NOT NULL,因此对于每个预先存在的行,它将需要一个值。

我正在寻找该列上的初始值,以在列创建时根据表中的其他值计算,并且在列创建时进行计算。

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

说我有这个数据:

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

INSERT INTO numbers(value1, value2) VALUES (10, 20), (2, 5);
Run Code Online (Sandbox Code Playgroud)

我希望value3numbers表上创建一个新列,该列在创建时始终等于其对应列value1value2列的总和。

例如:

ALTER TABLE numbers ADD COLUMN value3 INTEGER;

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

ALTER TABLE numbers
ALTER COLUMN value3 SET NOT NULL;
Run Code Online (Sandbox Code Playgroud)

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

-- The 3rd value will be the sum of the first 2 values
SELECT * FROM numbers;

value1 | value2 | value3
-------+--------+-------
10     | 20     | 30
2      | 5      | 7
Run Code Online (Sandbox Code Playgroud)

我稍后需要更新数据,可能会破坏关系value3 === (value1 + value2)

UPDATE numbers SET value3=9823 WHERE value1=10;
Run Code Online (Sandbox Code Playgroud)

如何实现将计算出的初始值插入到value3列中的步骤?

Ger*_*ica 13

我发现了一种相当简单的方法,以下添加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
Run Code Online (Sandbox Code Playgroud)

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