通常の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 |