मुझे नहीं पता कि आप कैसे और समझ सकते हैं कि घटना क्या हुई। आपको xmax के मान को देखना चाहिए, यदि xmax = 0 का अर्थ है कि पंक्ति डाली गई थी, तो अन्य मान xmax वहां पंक्ति अद्यतन थी।
मेरे पास खराब अंग्रेजी है और मैं उदाहरण दिखाने की कोशिश करूंगा।
create table test3(r1 text unique, r2 text);
\d+ test3
Table "public.test3"
Column | Type | Modifiers | Storage | Stats target | Description
--------+------+-----------+----------+--------------+-------------
r1 | text | | extended | |
r2 | text | | extended | |
Indexes:
"test3_r1_key" UNIQUE CONSTRAINT, btree (r1)
सम्मिलित
INSERT INTO test3
VALUES('www7','rrr'), ('www8','rrr2')
ON CONFLICT (r1) DO UPDATE SET r2 = 'QQQQ' RETURNING xmax;
xmax
------
0
0
यदि कोई डुप्लीकेट सम्मिलित करने का प्रयास करें:
INSERT INTO test3
VALUES('www7','rrr'), ('www8','rrr2')
ON CONFLICT (r1) DO UPDATE SET r2 = 'QQQQ' RETURNING xmax;
xmax
-----------
430343538
430343538
(2 rows)
INSERT 0 2
परिणाम इस तरह से संसाधित किया जा सकता:
सम्मिलित करना 1 नया और 1 डुप्लीकेट पंक्तियों
WITH t AS (
INSERT INTO test3
VALUES('www9','rrr'), ('www7','rrr2')
ON CONFLICT (r1) DO UPDATE SET r2 = 'QQQQ' RETURNING xmax
)
SELECT COUNT(*) AS all_rows,
SUM(CASE WHEN xmax = 0 THEN 1 ELSE 0 END) AS ins,
SUM(CASE WHEN xmax::text::int > 0 THEN 1 ELSE 0 END) AS upd
FROM t;
all_rows | ins | upd
----------+-----+-----
2 | 1 | 1
5.4. System Columns और MVCC
बहुत दिलचस्प देखते हैं कि कैसे अधिक शान से समस्या का समाधान कर सकते हैं