PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Por que essa regra não impede violações de chave duplicadas?


Regras por padrão adicionar coisas à ação atual :

Mas uma regra INSTEAD permite que você substitua a ação:

Então, acho que você quer especificar INSTEAD :
CREATE OR REPLACE RULE ignore_duplicate_inserts AS
   ON INSERT TO mytable
   WHERE (EXISTS ( SELECT mytable.id
           FROM mytable
          WHERE mytable.id = new.id)) DO INSTEAD NOTHING;

Sem o INSTEAD, sua regra está basicamente dizendo "faça o INSERT e depois não faça nada" quando você quiser dizer "em vez do INSERT, não faça nada" e, AFAIK, o DO INSTEAD NOTHING vai fazer isso.

Não sou especialista em regras do PostgreSQL, mas acho que adicionar o "INSTEAD" deve funcionar.

ATUALIZAÇÃO :Graças a araqnid sabemos disso :

Portanto, uma regra não vai funcionar nesta situação. No entanto, os acionadores são acionados durante COPY FROM para que você possa escrever um BEFORE INSERT gatilho que retornaria NULL quando detectou linhas duplicadas:

Dito isto, acho que seria melhor com o araqnid "carregar tudo em uma tabela temporária, limpá-lo e copiá-lo para o destino final" seria uma solução mais sensata para uma operação de carregamento em massa como você tem.