Pravidla ve výchozím nastavení přidat věci k aktuální akci :
Ale pravidlo INSTEAD vám umožňuje nahradit akci:
Takže si myslím, že chcete uvést NAMÍSTO :
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;
Bez INSTEAD vaše pravidlo v podstatě říká „udělejte INSERT a pak nedělejte nic“, když chcete říct „místo INSERT nedělejte nic“ a, AFAIK, DO INSTEAD NOTHING
udělá to.
Nejsem odborník na pravidla PostgreSQL, ale myslím, že přidání „INSTEAD“ by mělo fungovat.
AKTUALIZACE :Díky araqnid to víme :
Takže pravidlo v této situaci nebude fungovat. Spouštěče se však spouštějí během COPY FROM, takže můžete napsat PŘED INSERT spouštěč, který vrátí hodnotu NULL když zjistil duplicitní řádky:
To znamená, že si myslím, že by pro vás bylo lepší, kdyby araqnidovo „nahrajte to všechno do dočasné tabulky, vyčistěte to a zkopírujte to do konečného umístění“ by bylo rozumnějším řešením pro operaci hromadného načítání, jako máte vy.