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

あなたはそれをそのようにすることはできません。関数を作成すると、関数内のSQLが解析されます。関数の作成時に列が存在しないため、エラーメッセージが表示されます。

UPDATEステートメントを実行するには、動的SQLを使用する必要があります。

何かのようなもの:

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

次のようにステートメントに DEFAULT を追加するだけです。

ALTER TABLE "hi_scores" ADD "total_score" integer DEFAULT 0;
于 2012-04-24T12:53:49.420 に答える
0

@mu は既に提供されています: このプロシージャを関数として保存する場合は、動的 SQL をEXECUTE. ただし、UPDATE. ステートメントはALTER TABLE問題なく機能します。

これは明らかに1 回限りの操作であるため(同じ列を 2 回追加することはできません)、目的のために関数を永続化することはほとんど意味がありません。DO代わりに次のステートメントを使用できます。

DO 
$BODY$
BEGIN
   ALTER TABLE hi_scores ADD total_score integer;
   EXECUTE 'UPDATE hi_scores SET total_score = score1+score2+score3';
END;
$BODY$;

ただし、ここでも単純にしてください。2 つの 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 に答える