2017-01-18 1 views
0

Я пытаюсь выяснить, как правильно выполнить upsert в postgres в таблицу, в которой есть столбец первичного ключа с автоматическим приращением, называемый «id», и уникальный ключ в столбце «name», ,Ускорение в столбцах Postgres и auto increment

Проблема в том, что исходные и целевые таблицы находятся на двух отдельных машинах, поэтому у меня нет простого способа узнать, что последний «идентификатор» находится в таблице назначения.

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

Пример того, что я хочу сделать, это:

Источник таблицы:

id status name 
1 ok John 
2 open Monica 

Таблица назначения:

id status name 
.  .  . 
.  .  . 
44 ok David 
45 open John 

Результат upsert:

id status name 
.  .  . 
.  .  . 
44 ok David 
45 ok John 
46 open Monica 

Простой upsert будет иметь дублирующий конфликт ключа из-за столбца «id».

+1

Почему вы просто не вставляете (статус, имя) без id, поэтому последовательность будет заботиться о id? .. –

ответ

0

На стороне назначения создайте внешнюю таблицу для исходной таблицы с помощью postgres_fdw.

Затем вы можете использовать обычный

INSERT INTO dest (status, name) 
    SELECT status, name FROM foreign_source 
    ON CONFLICT DO UPDATE 
    SET status = EXCLUDED.status, 
     name = EXCLUDED.name; 

Это требует уникального ограничения на status или name или обоих.

+0

спасибо, кажется, у меня действительно была проблема с моей последовательностью, но я задал это как ответ, так как это может помогите любому, у кого есть аналогичный вопрос, важность не использования id в значениях вставки – johan855