PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Dlaczego ta reguła nie zapobiega naruszeniom zduplikowanych kluczy?

Reguły domyślnie dodają elementy do bieżącej akcji :

Ale reguła INSTEAD pozwala zastąpić akcję:

Myślę więc, że chcesz określić ZAMIAST :

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, twoja reguła zasadniczo mówi "zrób WSTAW, a następnie nic nie rób", gdy chcesz powiedzieć "zamiast WSTAW, nic nie rób" i, AFAIK, DO INSTEAD NOTHING zrobi to.

Nie jestem ekspertem w zakresie reguł PostgreSQL, ale myślę, że dodanie "ZAMIAST" powinno zadziałać.

AKTUALIZUJ :Dzięki araqnid wiemy o tym :

Więc reguła nie zadziała w tej sytuacji. Jednak wyzwalacze są uruchamiane podczas KOPIUJ Z, więc możesz napisać PRZED WSTAWIENIEM wyzwalacz, który zwróci NULL kiedy wykrył zduplikowane wiersze:

To powiedziawszy, myślę, że lepiej byłoby, gdyby araqnid „załaduj to wszystko do tabeli tymczasowej, wyczyść i skopiuj do miejsca docelowego” byłoby bardziej rozsądnym rozwiązaniem dla operacji ładowania zbiorczego, takiej jak ty.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Postgresql próbuje użyć formatu wykonania w funkcji, ale otrzymuje błąd nie znaleziono kolumny podczas podawania formatu ciągu w koalescencji

  2. Wstawianie prawidłowego json z kopią do tabeli postgres

  3. Wartość Postgres SSLMode wymaga nieważności, gdy obsługa protokołu SSL nie jest skompilowana przy użyciu zewnętrznego opakowania danych

  4. Sparametryzowana PostgreSQL funkcja Order By / Limit w tabeli

  5. Jak uzyskać licznik niedzieli w bieżącym miesiącu w psql?