Standaard regels dingen toevoegen aan de huidige actie :
Maar met een INSTEAD-regel kunt u de actie vervangen:
Dus ik denk dat je inSTEAD wilt specificeren :
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;
Zonder de INSTEAD is je regel in wezen zeggen "doe de INSERT en doe dan niets" wanneer je wilt zeggen "in plaats van de INSERT, doe niets" en, AFAIK, de DO INSTEAD NOTHING
zal dat doen.
Ik ben geen expert op het gebied van PostgreSQL-regels, maar ik denk dat het toevoegen van de "INSTEAD" zou moeten werken.
UPDATE :Dankzij araqnid We weten dat :
Dus een regel gaat niet werken in deze situatie. Er worden echter triggers geactiveerd tijdens COPY FROM, dus u kunt een BEFORE INSERT schrijven trigger die NULL retourneert wanneer het dubbele rijen detecteerde:
Dat gezegd hebbende, denk ik dat je beter af zou zijn met araqnid's "laad het allemaal in een tijdelijke tabel, ruim het op en kopieer het naar de eindbestemming" zou een verstandiger oplossing zijn voor een bulklaadoperatie zoals je hebt.