2016-05-27 7 views
0

У меня есть две таблицы public_a.budget_items и public_b.budget_items с идентичными схемами и я пытаюсь скопировать недостающие записи одного из них на другой, используя этот запрос:PostgreSQL: скопировать недостающие записи из одной таблицы в другую

INSERT INTO public_b.budget_items 
SELECT a.* 
FROM public_a.budget_items a 
WHERE a.id NOT IN (SELECT b.id 
        FROM public_b.budget_items b 
        WHERE b.id = a.id 
          OR (b.budget_id = a.budget_id 
           AND b.NAME = a.NAME 
           AND b.type = a.type 
           AND b.asset = a.asset)) 

но я получаю эту ошибку:

ERROR: duplicate key value violates unique constraint "uc_budget_items_parent_null" SQL state: 23505 Detail: Key (budget_id, name, type, asset)=(3486, Octopus, 6, T) already exists

ограничение uc_budget_items_parent_null определяется следующим образом:

CREATE UNIQUE INDEX uc_budget_items_parent_null ON budget_items USING btree (
budget_id, name, type, asset); 

Я думал, что условие (b.budget_id=a.budget_id and b.name=a.name and b.type = a.type and b.asset = a.asset) должно помочь мне избежать этой проблемы, но, похоже, она не работает.

Очевидно, что я что-то пропустил. Есть идеи?

+0

Будет ли 'where a.id not in (select id from public_b.budget_items)' работать? – Bill

+0

@Bill No. В таблице помимо дополнительных первичных ключей (id) есть дополнительные ограничения, например 'uc_budget_items_parent_null'. Я должен учитывать эти ограничения в запросе. – EatEmAll

ответ

1

Я думаю, что здесь у вас слишком глубокая рекурсия. Попробуйте следующее:

INSERT INTO public_b.budget_items 
SELECT a.* 
FROM  public_a.budget_items a 
LEFT JOIN public_b.budget_items b 
     ON b.id = a.id 
     OR (b.budget_id = a.budget_id 
      AND b.NAME = a.NAME 
      AND b.type = a.type 
      AND b.asset = a.asset) 
WHERE b.id Is NULL 
+0

Да, это сработало для меня. Благодаря! – EatEmAll

Смежные вопросы