2015-01-12 3 views
1

У меня есть главный стол postgres с ограничениями, первичный ключ (id) и обычный материал.Как слить таблицу postgres в другую?

Тогда у меня есть временная таблица с одинаковыми столбцами, но без ограничений. Я использую эту временную таблицу для массовых вставных партий.

Время от времени я хочу объединить эти таблицы by id, означает: Я хочу, чтобы вставить данные из временной таблицы в основную таблицу, гарантирующий:

  • идентификаторы, которые не существуют в основной таблица должна быть просто вставляет
  • идентификаторов, которые делают, следует включать обновления

Как они могут быть лучше реализованы в течение приблизительно 1 миллион + записей во временной таблице?

+1

Это не простая задача. Если вы ищете 'postgres upsert' или' on duplicate update', вы увидите, что это довольно большая проблема, будь то на Java или непосредственно из psql. – Kayaman

+0

Является ли ваш 'id'' serial' (т. Е. Владеет последовательностью)? Если вы хотите, чтобы ваша временная таблица 'id's ** и ** использовала последовательность для других вставок в вашей основной таблице, вы должны заблокировать всю таблицу для вставки (вам нужно исправить вашу последовательность вручную, после вставки) - upserts обычно работают лучше всего, если у вас будет другое уникальное ограничение (кроме сгенерированного первичного ключа). – pozs

+0

'id' не является последовательностью базы данных, и я не хочу автоматического увеличения при вставке, поскольку я управляю идентификаторами извне. Я хочу, чтобы идентификатор из таблицы temp был точно таким же после слияния, поскольку они служат идентификатором, если строка должна быть обновлена ​​(если существует id) или недавно вставлена ​​(если идентификатор не существует). – membersound

ответ

-1

Вы должны использовать merge Постулаты:

MERGE INTO main_table main 
USING temp_table temp 
ON main.Id = temp.Id 
WHEN MATCHED THEN 
UPDATE SET main.name=temp.name .... 
WHEN NOT MATCHED THEN 
INSERT VALUES (Id, .....) 
+3

К сожалению, у Postgres нет инструкции 'MERGE' –

0

После ответ основан на UPDATES сделал в жестокой образом: DELETE + INSERT

  1. падение ограничения на основной таблице

    ALTER TABLE [main_table] DROP CONSTRAINT ...

    ALTER TABLE [main_table] DROP CONSTRAINT ...

  2. Удаление строки из главной таблицы, которые существуют во временной одной

    DELETE FROM [main_table] WHERE id IN (SELECT id FROM [temp_table]);

  3. Вставьте в основной стол все из временной таблицы

    INSERT INTO [main_table] SELECT * FROM [temp_table];

  4. Recreate ограничения

    ALTER TABLE [main_table] ADD FOREIGN KEY ...

    ALTER TABLE [main_table] ADD FOREIGN KEY ...

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