Theo tài liệu,
Tất cả các chỉ mục duy nhất của tên_bảng, không liên quan đến thứ tự, chứa chính xác các cột / biểu thức do mục tiêu chỉ định được suy ra (được chọn) dưới dạng arbiterindexes. Nếu một index_predicate được chỉ định, nó phải đáp ứng các chỉ mục trọng tài như một yêu cầu khác để suy luận.
Các tài liệu tiếp tục nói,
[index_predicate are u] sed cho phép suy luận các chỉ mục duy nhất một phần
Nói một cách ngắn gọn, các tài liệu nói rằng khi sử dụng chỉ mục một phần và uperting bằng ON CONFLICT, thì index_predicate phải được chỉ định . Nó không được giới thiệu cho bạn. Tôi đã học được điều này ở đây và ví dụ sau đây chứng minh điều này.
CREATE TABLE test.accounts (
id int PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
type text,
person_id int);
CREATE UNIQUE INDEX accounts_note_idx on accounts (type, person_id) WHERE ((type)::text = 'PersonAccount'::text);
INSERT INTO test.accounts (type, person_id) VALUES ('PersonAccount', 10);
để chúng tôi có:
unutbu=# select * from test.accounts;
+----+---------------+-----------+
| id | type | person_id |
+----+---------------+-----------+
| 1 | PersonAccount | 10 |
+----+---------------+-----------+
(1 row)
Không có index_predicate
chúng tôi gặp lỗi:
INSERT INTO test.accounts (type, person_id) VALUES ('PersonAccount', 10) ON CONFLICT (type, person_id) DO NOTHING;
-- ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification
Nhưng nếu thay vào đó, bạn bao gồm index_predicate, WHERE ((type)::text = 'PersonAccount'::text)
:
INSERT INTO test.accounts (type, person_id) VALUES ('PersonAccount', 10)
ON CONFLICT (type, person_id)
WHERE ((type)::text = 'PersonAccount'::text) DO NOTHING;
thì không có lỗi và KHÔNG CÓ GÌ được tôn trọng.