sql >> Database >  >> RDS >> PostgreSQL

Waarom voorkomt deze regel niet dat dubbele sleutels worden geschonden?

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.



  1. Onjuist sleutelbestand met MySQL

  2. Ongedefinieerde index:REMOTE_ADDR terwijl Laravel migreert

  3. mySQL-query die Resource-id #5 retourneert

  4. UTF-16/Unicode-gegevens opslaan in SQL Server