Правила по умолчанию добавляют вещи к текущему действию :
Грубо говоря, правило приводит к выполнению дополнительных команд при выполнении данной команды в данной таблице.
Но правило INSTEAD позволяет заменить действие:
В качестве альтернативы правило INSTEAD может заменить данную команду другой или заставить команду не выполнятьсявообще.
Итак, я думаю, вы хотите, чтобы указывал INSTEAD :
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и затем ничего не делать «когда вы хотите сказать» вместо ВСТАВКИ, ничего не делать », и, AFAIK, DO INSTEAD NOTHING
сделает это.
Я не эксперт по правилам PostgreSQL, но я думаю, что добавление«INSTEAD» должен работать.
ОБНОВЛЕНИЕ : Благодаря araqnid мы знаем, что :
COPY FROM вызовет любые триггеры ипроверить ограничения в таблице назначения.Однако он не будет вызывать правила
, поэтому правило не будет работать в этой ситуации.Тем не менее, триггеры запускаются во время COPY FROM, поэтому вы можете написать триггер BEFORE INSERT , который будет возвращать NULL при обнаружении повторяющихся строк:
Он может вернуть NULL, чтобы пропустить операциютекущий ряд.Это указывает исполнителю не выполнять операцию на уровне строк, которая вызвала триггер (вставка или изменение определенной строки таблицы).
Тем не менее, я думаю, что вам лучше использовать araqnid«загрузить все это во временную таблицу, очистить и скопировать в конечный пункт назначения» было бы более разумным решением для такой операции массовой загрузки, как у вас.