2017-02-03 22 views
8

Tôi nhận được lỗi sau khi làm các loại sau đây của chèn:Không duy nhất hoặc loại trừ chế phù hợp với ON XUNG ĐỘT

Query:

INSERT INTO accounts (type, person_id) VALUES ('PersonAccount', 1) ON 
CONFLICT (type, person_id) WHERE type = 'PersonAccount' DO UPDATE SET 
updated_at = EXCLUDED.updated_at RETURNING * 

Lỗi:

SQL execution failed (Reason: ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification)

tôi cũng có một INDEX duy nhất:

CREATE UNIQUE INDEX uniq_person_accounts ON accounts USING btree (type, 
person_id) WHERE ((type)::text = 'PersonAccount'::text); 

Vấn đề là đôi khi nó hoạt động, nhưng không phải mọi lúc. Tôi ngẫu nhiên nhận được ngoại lệ đó, điều này thực sự lạ. Dường như nó không thể truy cập vào đó INDEX hoặc nó không biết nó tồn tại.

Bất kỳ đề xuất nào?

Tôi đang sử dụng PostgreSQL 9.5.5.

Ví dụ trong khi thực hiện các mã mà cố gắng để tìm hoặc tạo một tài khoản:

INSERT INTO accounts (type, person_id, created_at, updated_at) VALUES ('PersonAccount', 69559, '2017-02-03 12:09:27.259', '2017-02-03 12:09:27.259') ON CONFLICT (type, person_id) WHERE type = 'PersonAccount' DO UPDATE SET updated_at = EXCLUDED.updated_at RETURNING * 
SQL execution failed (Reason: ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification) 

Trong trường hợp này, tôi chắc chắn rằng tài khoản không tồn tại. Hơn nữa, nó không bao giờ xuất ra lỗi khi người đó đã có tài khoản. Vấn đề là, trong một số trường hợp, nó cũng hoạt động nếu chưa có tài khoản. Truy vấn hoàn toàn giống nhau.

+1

có lẽ bởi vì nó là một phần index .. –

+0

bạn có thể xây dựng? –

+0

@VaoTsun chỉ mục một phần được hỗ trợ bởi 'ON CONFLICT' – pozs

Trả lời

1

tôi đã không có cơ hội để chơi với UPSERT, nhưng tôi nghĩ rằng bạn có một trường hợp từ docs:

Note that this means a non-partial unique index (a unique index without a predicate) will be inferred (and thus used by ON CONFLICT) if such an index satisfying every other criteria is available. If an attempt at inference is unsuccessful, an error is raised.

+1

Tôi thấy rằng trong tài liệu là tốt, nhưng từ cách giải thích của tôi, nếu nó không thể suy ra chỉ mục, nó sẽ luôn luôn thất bại để làm điều đó, không chỉ đôi khi. Hơn nữa, chỉ định hành vi cho các chỉ mục không phải một phần duy nhất không được tạo ra. Trong trường hợp của tôi, tôi đang sử dụng một chỉ mục một phần duy nhất. –

Các vấn đề liên quan