Eu estava olhando a INSERT INTO .. ON CONFLICT (..) DO UPDATE ..
sintaxe do PostgreSQL e percebi que você não pode fazer várias verificações de restrição exclusivas com ele. Quero dizer, você se refere a um índice exclusivo composto pelos nomes das colunas ON CONFLICT (Name, Symbol)
(se o índice exclusivo estiver definido para essas duas colunas) ou usa a chave primária. Se você definir dois índices exclusivos separados para as colunas, poderá verificar apenas um.
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';
Pode gerar um erro, dizendo que J
é uma duplicata. No entanto, este exemplo é simplesmente um design ruim, porque o símbolo deve estar em outra tabela e ser conectado à tabela do aluno por meio de um relacionamento um para muitos. É por isso que me pergunto, talvez o PostgreSQL tenha on conflict
sido projetado dessa maneira, porque você SEMPRE pode reestruturar as tabelas de uma maneira, onde existe apenas um único índice. É verdade ou existe outra razão?
Exemplo de violino: http://www.sqlfiddle.com/#!17/9c0ce