Я посмотрел на INSERT INTO .. ON CONFLICT (..) DO UPDATE ..
синтаксис PostgreSQL и понял, что вы не можете сделать несколько уникальных проверок ограничений с ним. Я имею в виду, что вы либо ссылаетесь на составной уникальный индекс по именам столбцов ON CONFLICT (Name, Symbol)
(если уникальный индекс определен для этих двух столбцов), либо используете первичный ключ. Если вы определяете два отдельных уникальных индекса для столбцов, вы можете проверить только один.
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';
Может выдать ошибку, говоря, J
является дубликатом. Однако этот пример просто плохой дизайн, потому что Символ должен быть в другой таблице и быть связан с таблицей ученика через отношение один ко многим. Вот почему мне интересно, может быть, PostgreSQL on conflict
был спроектирован таким образом, потому что вы ВСЕГДА можете реструктурировать таблицы таким образом, чтобы в них был только один уникальный индекс. Это правда или есть другая причина?
Пример скрипки: http://www.sqlfiddle.com/#!17/9c0ce