我正在寻找向填充有值的预先存在的表添加一个新列。新列将是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)
我希望value3在numbers表上创建一个新列,该列在创建时始终等于其对应列value1和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;
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 本身没有提供的操作,此方法将更加复杂。
| 归档时间: |
|
| 查看次数: |
9062 次 |
| 最近记录: |