如何将列添加到现有表,然后在单个PostgreSQL函数中使用它

时间:2012-04-24 12:52:07

标签: postgresql

我有一个由第三方产品在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,但我似乎无法弄清楚是什么我需要做。

3 个答案:

答案 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。但仅适用于UPDATEALTER 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;