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

Я пытаюсь вставить в таблицу в базе данных 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 равно нулю, и цель не заменяет его значением по умолчанию.

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

Спасибо!

1 Ответ

3 голосов
/ 06 июня 2019

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

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

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

...