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
fonte
Respostas:
Sempre existe o sexto, ou chave de domínio, forma normal. Aqui cada coluna não chave se torna sua própria tabela. Portanto, a tabela 3NF T (Chave, Col1, Col2, ..) torna-se T1 (Chave, Col1), T2 (Chave, Col2) etc. Essas novas tabelas que requerem exclusividade podem ser declaradas.
Porém, acho que ter várias restrições únicas em uma tabela é perfeitamente aceitável. Tomemos, por exemplo, uma tabela de países. Isso teria, digamos, um ID, o nome, o código ISO, a capital e alguns outros. Cada um desses quatro primeiros será único. Além disso, se queremos que nosso sistema confie em cada um como único, acredito que devemos definir restrições únicas para cada um. Isso reforça verdades sobre os dados nos quais todos os consumidores podem confiar.
fonte
MERGE
instrução). A páginaON CONFLICT DO UPDATE
foi adicionada apenas na versão 9.5 e é muito mais limitada.ON CONFLICT DO NOTHING
sem mencionar restrições exclusivas e ele considerará todas elas (e não fará nada). Quando você quer fazerON CONFLICT DO UPDATE
, você deve declarar uma coluna ou restrição e apenas uma. A restrição pode ser levantada em versões futuras.ON CONFLICT ... DO UPDATE
e, infelizmente, esta resposta não aborda esse ponto.