ON CONFLICT
yêu cầu một chỉ mục duy nhất * để phát hiện xung đột. Vì vậy, bạn chỉ cần tạo một chỉ mục duy nhất trên cả hai cột:
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
* Ngoài các chỉ mục duy nhất, bạn cũng có thể sử dụng các ràng buộc loại trừ. Đây là những ràng buộc chung chung hơn một chút so với các ràng buộc duy nhất. Giả sử bảng của bạn có các cột cho id
và valid_time
(và valid_time
là một tsrange
) và bạn muốn cho phép id
trùng lặp s, nhưng không phải đối với các khoảng thời gian trùng lặp. Một ràng buộc duy nhất sẽ không giúp bạn, nhưng với một ràng buộc loại trừ, bạn có thể nói "loại trừ các bản ghi mới nếu id
của chúng bằng một id
cũ và cả valid_time
của họ chồng lên valid_time
của nó . "