Tôi đã xem INSERT INTO .. ON CONFLICT (..) DO UPDATE ..
cú pháp của PostgreSQL và nhận ra, bạn không thể thực hiện nhiều kiểm tra ràng buộc duy nhất với nó. Ý tôi là, bạn hoặc tham khảo một chỉ mục duy nhất tổng hợp theo tên cột ON CONFLICT (Name, Symbol)
(nếu chỉ mục duy nhất được xác định cho hai cột này) hoặc bạn sử dụng khóa chính. Nếu bạn xác định hai chỉ mục duy nhất riêng biệt cho các cột, bạn chỉ có thể kiểm tra một chỉ mục.
CREATE TABLE student
(Id int primary key, Name varchar(50), Symbol varchar(50),
CONSTRAINT col1_unique UNIQUE (Name),
CONSTRAINT col2_unique UNIQUE (Symbol)
);
INSERT INTO student
(Id, Name, Symbol)
VALUES
(1, 'John', 'J'),
(2, 'David', 'D'),
(3, 'Will', 'W');
INSERT INTO student
(Id, Name, Symbol)
VALUES
(4, 'Jeremy', 'J')
on conflict(Name) DO UPDATE
set Name = 'Jeremy';
Có thể ném một lỗi, nói J
là một bản sao. Tuy nhiên, ví dụ này chỉ đơn giản là một thiết kế xấu, vì Biểu tượng nên ở trong một bảng khác và được kết nối với bảng sinh viên thông qua mối quan hệ một đến nhiều. Đó là lý do tại sao tôi tự hỏi, có lẽ PostgreQuery on conflict
được thiết kế theo cách này, bởi vì bạn có thể LUÔN cấu trúc lại các bảng theo cách mà chỉ có một chỉ mục duy nhất. Là sự thật hay có một lý do khác?
Ví dụ fiddle: http://www.sqlfiddle.com/#!17/9c0ce