У меня есть две таблицы:
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");
Исключительный результатчто если нет конфликта, данные, возвращенные из подзапроса, вставляются в новую строку в таблице разрешений.
Если возникает конфликт, я бы хотел обновить ТОЛЬКО недавно назначенного оператора связи, а не обновлять или вставлять новую строку, поскольку этот сосуд уже существует.