Postgres BIGSERIAL не разделяет последовательность, когда вставки выполняются с нескольких удаленных источников fdw

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

Сначала я определил таблицы так:

Целевая база данных:

create table dummy (
  dummy_pk bigserial primary key
  -- other fields
);

Источники базы данных:

create foreign table dummy (
  dummy_pk bigserial
  -- other fields
) server ... ;

Это решение работало нормально, пока я вставлял только из одного источника, когда я пытался вставить из другого, без указания dummy_pk, я получил это сообщение:

Повторяющийся ключ (dummy_pk) = (1)

Поскольку postgres пытается вставить идентификатор 1, я считаю, что последовательность, используемая для каждой исходной внешней таблицы, отличается. Я немного изменил исходные таблицы, чтобы позволить последовательности целевой таблицы выполнять работу для идентификатора:

create foreign table dummy (
  dummy_pk bigint
  -- other fields
) server ... ;

На этот раз у меня другая ошибка:

Значение NULL нарушает константу NOT NULL в столбце «dummy_pk».

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

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

Спасибо!


person TheWildHealer    schedule 06.06.2019    source источник


Ответы (1)


Удалите dummy_pk из сторонних таблиц, чтобы таблица назначения не получала ни NULL, ни значения, и поэтому откатывалась к DEFAULT или NULL, если DEFAULT не указано. Если вы попытаетесь передать DEFAULT внешней таблице, она попытается использовать вместо этого DEFAULT значение внешней таблицы.

create foreign table dummy (
  /*dummy_pk bigserial,*/
  column1 text,
  column2 int2,
  -- other fields
) server ... ;

Другой способ - получить значения последовательности с целевого сервера с помощью dblink, но я думаю, что это лучше (если вы можете позволить себе удалить этот столбец из сторонних таблиц).

person Łukasz Kamiński    schedule 06.06.2019
comment
Спасибо за ваш ответ. Мне нужен этот столбец в других запросах. Могу ли я создать две сторонние таблицы для ссылки на одну и ту же удаленную таблицу на одном сервере? Я мог бы создать один без pk, один с? - person TheWildHealer; 06.06.2019
comment
Да, просто нужно указать схему и / или имя таблицы на целевом сервере, если они разные (и они должны быть, если у вас есть дублированная сторонняя таблица) OPTIONS (schema_name 'some_schema', table_name 'some_name') - person Łukasz Kamiński; 06.06.2019
comment
Да, уже сделал, хотя у них одно и то же имя, на всякий случай, спасибо. - person TheWildHealer; 06.06.2019