我希望将新列添加到预先存在的表中,该表填充了值。新列将为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;
列的步骤?
提前致谢!
答案 0 :(得分:0)
您有两种选择:
如果您需要将计算值存储在数据库中的触发器。
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();
如果您不需要将计算值存储在数据库中,则可以使用功能索引
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原生提供的操作,此方法将更加复杂。