0

我有一个由第三方产品在 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在它尝试执行更新之前运行它,但我似乎无法弄清楚我需要做什么。

4

3 回答 3

0

只需将 DEFAULT 添加到您的语句中,如下所示:

ALTER TABLE "hi_scores" ADD "total_score" integer DEFAULT 0;
于 2012-04-24T12:53:49.420 回答
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;

(未经测试,因此可能存在语法错误)

于 2012-04-24T13:54:19.610 回答
0

@mu 已经提供:如果要将此过程保存为函数,则必须使用带有EXECUTE. 但仅限于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;
于 2012-04-25T05:21:51.460 回答