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

如何将列添加到现有表中,然后在单个PostgreSQL函数中使用它,postgresql,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$

我有一个表是由第三方产品在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字段存在。我刚刚收到消息错误:关系hi_分数的列total_分数不存在


我猜这是与执行计划相关的原因,可能我需要告诉它在尝试执行更新之前运行ALTER表,但我似乎不知道我需要做什么。

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

ALTER TABLE "hi_scores" ADD "total_score" integer DEFAULT 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;

未测试,因此已经提供的mu中可能存在语法错误:如果要将此过程另存为函数,则必须将动态SQL与EXECUTE一起使用。但仅用于更新。ALTERTABLE语句工作正常

由于这显然是一个一次性操作,不能将同一列添加两次,因此很难为此目的保留函数。您可以改为使用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,更新就会正常工作。在事务内部与否-不重要,只要您按顺序执行它们

  ALTER TABLE hi_scores ADD total_score integer;

  UPDATE hi_scores SET total_score = score1+score2+score3;

谢谢你的建议-我试过了,但它没有改变错误信息。谢谢,这是我需要知道的。最后,我将流程分为两个函数,在执行ALTER TABLE函数后,我必须创建一个更新函数,这样接口将允许我保存它,然后提交ALTER函数,这意味着字段存在,我可以执行更新。我大体上同意,但在函数中包含它是有用的,因为我经常使用的软件会从零开始删除并重新创建表格。这是重新创建的后续工作的一部分,因此,尽管每次创建表只需要发生一次,但这是一个计划的事件。@glenatron:为什么不计划简单的SQL命令呢?因为我正在通过同一工具的接口工作,它有一个在postgres中调用函数的功能,但不执行特殊查询。