1

通常のINSERTORUPDATEコンドラムを拡張する

通常のUPDATEまたはINSERTを提供する関数があり、次のようになります。

CREATE OR REPLACE FUNCTION updateslave ( varchar(7), smallint ) RETURNS void AS
$$
 BEGIN
   LOOP
     UPDATE consist SET
       master = $1,
       time = now() WHERE slave = $2;
     IF found THEN
       RETURN;
     END IF;
     BEGIN
       INSERT INTO consist(master, slave, time) VALUES ( $1, $2, now() );
       RETURN;
     EXCEPTION WHEN unique_violation THEN
       -- do nothing, then loop and retry
     END;
   END LOOP;
 END;
##
LANGUAGE plpgsql;

さて、問題は、別のテーブルで同様の操作を行うために書き直そうとしていることです。ただし、この他のテーブルには単一の一意の列はなく、2つの列の組み合わせは1つの行にのみ存在するという違いがあります。代わりに2つの列の組み合わせに基づいてunique_violationを宣言することは可能ですか?

例を単純にするために、テーブルが上記の関数を使用するテーブルとまったく同じに見えると仮定しますが、マスターとスレーブが一緒になって一意性を生成する2つの列です。

 Column |            Type             |                  Modifiers                   | Storage  | Description
--------+-----------------------------+----------------------------------------------+----------+-------------
 master | character varying(7)        | not null default 'unused'::character varying | extended |
 slave  | smallint                    | not null                                     | plain    |
 time   | timestamp without time zone | default now()                                | plain    |
4

1 に答える 1

3

最善のアプローチは、テーブルに一意の制約を定義することです。これにより、更新がどのように行われるかに関係なく、つまり、procが使用されているかどうかに関係なく、すべてがOKです。

これを行う最も簡単な方法は、2つの列に一意のインデックスを作成することです。

create unique index any_mame on mytable(col1, col2);

テーブルを変更して一意の制約を追加することもできますが、大きな違いはありません。

于 2012-11-28T21:12:47.137 に答える