PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Защо това правило не предотвратява дублирани нарушения на ключове?

Правила по подразбиране добавяне на неща към текущото действие :

Но правило ВМЕСТО ви позволява да замените действието:

И така, мисля, че искате да посочите ВМЕСТО :

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;

Без INSTEAD вашето правило по същество казва „направете INSERT и след това не правете нищо“, когато искате да кажете „вместо INSERT, не правете нищо“ и AFAIK, DO INSTEAD NOTHING ще направи това.

Не съм експерт по правилата на PostgreSQL, но мисля, че добавянето на „ВМЕСТО“ трябва да свърши работа.

АКТУАЛИЗАЦИЯ :Благодарение на araqnid знаем това :

Така че правилото няма да работи в тази ситуация. Въпреки това тригерите се задействат по време на COPY FROM, така че можете да напишете ПРЕДИ ВМЪКВАНЕ тригер, който би върнал NULL когато открие дублиращи се редове:

Въпреки това мисля, че би било по-добре с araqnid „заредете всичко във временна таблица, почистете го и го копирайте до крайната дестинация“ би било по-разумно решение за операция за групово зареждане, както имате.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да работя с PGpoint за геолокация, използвайки PostgreSQL?

  2. алтернатива на mysql_insert_id за postgresql

  3. Django OneToOneField с възможно празно поле

  4. Преместване на клъстер от данни postgresql

  5. Изборът не връща стойности Postgres-11.4