Как сохранить при использовании данных из подзапроса (Postgres) - PullRequest
0 голосов
/ 06 октября 2019

У меня есть две таблицы:

  • assignments {recceptacleId, assignedCarrier}
  • rls_permissions {receptacleId, rlsUserId}

Назначение в этом контексте - любое сословие на отношения авиакомпании-перевозчика.

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

Проблема, с которой я столкнулся с upsert, в частности, ON CONFLICT ON CONSTRAINT, состоит в том, что в моем операторе вставки содержится подзапрос для данных, которые нужно вставить, и поэтому я не уверен, как написать DOОБНОВЛЕНИЕ SET часть инструкции

Я пытался использовать 'исключение', чтобы попытаться выделить выделенный оператор, который я хочу обновить, основываясь на предыдущем конфликте, однако я продолжаю получать "ОШИБКА: столбец исключен.receptacleId неСуществуют "

Мой pkey выглядит так:

CREATE UNIQUE INDEX rls_permissions_pkey ON rls_permissions("receptacleId" text_ops);

Фиктивные данные могут быть:

receptacleID    assignedCarrier
aaaaaaaaaa00    AA               

Где AA -" American Airlines "

INSERT INTO rls_permissions ("receptacleId","rlsUserId") 
SELECT DISTINCT assignments."receptacleId", assignments."assignedCarrier" 
FROM assignments
ON CONFLICT ON CONSTRAINT rls_permissions_pkey
DO UPDATE SET "rlsUserId" = (SELECT DISTINCT assignments."assignedCarrier" 
                             FROM assignments 
                             WHERE assignments."receptacleId" = excluded."receptacleId");

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

Если возникает конфликт, я бы хотел обновить ТОЛЬКО недавно назначенного оператора связи, а не обновлять или вставлять новую строку, поскольку этот сосуд уже существует.

1 Ответ

0 голосов
/ 06 октября 2019

Вам не нужен подзапрос в части ОБНОВЛЕНИЕ. Вы можете получить доступ к значениям для детали INSERT через ключевое слово excluded.

INSERT INTO rls_permissions ("receptacleId","rlsUserId") 
SELECT DISTINCT assignments."receptacleId", assignments."assignedCarrier" 
FROM assignments
ON CONFLICT ON CONSTRAINT rls_permissions_pkey
DO UPDATE SET "rlsUserId" = excluded."rlsUserId";

ссылка на excluded."rlsUserId" относится к значению, которое было бы вставлено в столбец rlsUserId, и, таким образом, это извлеченное значениедо assignments."assignedCarrier" из вашего оператора SELECT.

...