ON CONFLICT
競合検出を行うには、一意のインデックス*が必要です。したがって、両方の列に一意のインデックスを作成する必要があります:
t=# create table t (id integer, a text, b text);
CREATE TABLE
t=# create unique index idx_t_id_a on t (id, a);
CREATE INDEX
t=# insert into t values (1, 'a', 'foo');
INSERT 0 1
t=# insert into t values (1, 'a', 'bar') on conflict (id, a) do update set b = 'bar';
INSERT 0 1
t=# select * from t;
id | a | b
----+---+-----
1 | a | bar
*一意のインデックスに加えて、除外制約を使用することもできます。これらは、一意の制約よりも少し一般的です。テーブルにid
の列があるとします。 およびvalid_time
(およびvalid_time
tsrange
です )、重複するid
を許可したい s。ただし、期間が重複している場合は除きます。一意の制約は役に立ちませんが、除外制約を使用すると、「id
の場合は新しいレコードを除外する」と言うことができます。 古いid
と同じ また、valid_time
そのvalid_time
と重複しています 。"