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
को ओवरलैप करता है ।"