我有一个由第三方产品在PostgreSQL(版本9)数据库中创建的表,我需要更改该表以添加新列,然后将所讨论的列设置为标准值。
我的功能中有以下内容:
CREATE FUNCTION alterscorecolumns()
RETURNS void AS
$BODY$
ALTER TABLE "hi_scores" ADD "total_score" integer;
UPDATE "hi_scores" SET total_score = score1+score2+score3;
$BODY$
但是,我不允许这样做,因为它不知道total_score
字段存在。我刚收到消息ERROR: column "total_score" of relation "hi_scores" does not exist.
我猜这里有一些执行计划相关的原因,也许我需要告诉它在尝试执行更新之前运行ALTER TABLE
,但我似乎无法弄清楚是什么我需要做。
答案 0 :(得分:0)
只需在您的语句中添加DEFAULT,如下所示:
ALTER TABLE "hi_scores" ADD "total_score" integer DEFAULT 0;
答案 1 :(得分:0)
你不能这样做。创建函数时,将解析函数中的SQL。在创建函数时,列不存在,因此您将收到错误消息。
您需要使用动态SQL来运行UPDATE语句。
类似的东西:
CREATE FUNCTION alterscorecolumns()
RETURNS void AS
$BODY$
begin
execute 'ALTER TABLE hi_scores ADD total_score integer';
execute 'UPDATE hi_scores SET total_score = score1+score2+score3';
$BODY$
language plpgsql;
(未经测试,因此可能存在语法错误)
答案 2 :(得分:0)
已经提供了@mu:如果要将此过程保存为函数,则必须使用带EXECUTE
的动态SQL。但仅适用于UPDATE
。 ALTER TABLE
语句可以正常工作。
由于这显然是一次性操作(不能两次添加相同的列),因此为此目的保留一个函数几乎没有意义。您可以改为使用DO
语句:
DO
$BODY$
BEGIN
ALTER TABLE hi_scores ADD total_score integer;
EXECUTE 'UPDATE hi_scores SET total_score = score1+score2+score3';
END;
$BODY$;
但话又说回来,保持简单:只执行两个SQL语句。只要ALTER TABLE
完成,UPDATE
就会正常工作。在交易中或不交易 - 无关紧要,只要您按顺序执行它们。
ALTER TABLE hi_scores ADD total_score integer;
UPDATE hi_scores SET total_score = score1+score2+score3;