Использование идентификатора, возвращенного из вставки в операторе with в postgresql - PullRequest
0 голосов
/ 01 мая 2018

Скажем, что у вас есть следующая структура таблицы, что вам нравится Википедия, где идентичность и состояние страницы хранятся в разных таблицах:

create table endUsers (
  uuid             UUID         primary key,
  created          timestamptz  default now()
);

create table endUserRevisions (
  id               bigserial    primary key,
  endUser          UUID         not null        references endUsers,
  modified         timestamptz  default now(),
  modifiedBy       UUID         not null        references portalUsers,
  name             text         not null,
  company          text         not null,
  email            text         not null
);

alter table endUsers add column
  latestRevision  bigint        not null        references endUserRevisions;

И затем вы хотите вставить в эту базу данных совершенно нового пользователя, например:

with lastID as (
  insert into  endUserRevisions (endUser, name, company, email)
    values ('08e7882c-7596-43d1-b4cc-69f855210d72', 'a', 'b', 'c') returning id)
insert into endUsers (uuid, latestRevision)
  values ('08e7882c-7596-43d1-b4cc-69f855210d72', lastID);

-- or

with revision as (
  insert into  endUserRevisions (endUser, name, company, email)
    values ('08e7882c-7596-43d1-b4cc-69f855210d72', 'a', 'b', 'c') returning *)
insert into endUsers (uuid, latestRevision)
  values ('08e7882c-7596-43d1-b4cc-69f855210d72', revision.id);

Оба эти варианта завершаются с ошибкой либо

столбец "lastid" не существует

или

отсутствует запись предложения FROM для таблицы "last"

1 Ответ

0 голосов
/ 01 мая 2018

Причина сбоя заключается в том, что каждый подзапрос доступен для окружающего контекста в виде таблицы, а не в виде простого значения. Другими словами, к нему нужно обращаться с помощью оператора select, например:

with revision as (
  insert into  endUserRevisions (endUser, name, company, email)
    values ('08e7882c-7596-43d1-b4cc-79f855210d76', 'a', 'b', 'c') returning id)
insert into endUsers (uuid, latestRevision)
 values ('08e7882c-7596-43d1-b4cc-79f855210d76', (select id from revision));

-- or

with revision as (                                                                                                    
  insert into  endUserRevisions (endUser, name, company, email)                                                       
    values ('08e7882c-7596-43d1-b4cc-79f855210d74', 'a', 'b', 'c') returning id)                                      
insert into endUsers (uuid, latestRevision)                                                                           
  select '08e7882c-7596-43d1-b4cc-79f855210d74', revision.id from revision; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...