sql >> Databáze >  >> RDS >> PostgreSQL

Proč toto pravidlo nezabrání duplicitnímu porušení klíčů?

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.



  1. Vraťte řádky, které obsahují číselné hodnoty v Oracle

  2. Určení schématu v Pandas to_sql

  3. Jak QUOTE() funguje v MariaDB

  4. Úplné připojení MySql (sjednocení) a objednávání na více sloupcích data