Postgres Editable Union View - PullRequest
       17

Postgres Editable Union View

1 голос
/ 02 июля 2010

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

То есть, если Джо связан с Салли, то в представлении должно быть показано, что Джо связан с Салли, а Салли связана с Джо.

Итак, я создал СОЮЗ следующим образом:

CREATE VIEW links AS

SELECT  id,
  link_origin_id AS person_id,
  link_origin_id,
  link_rcvd_id,
  link_type,
  link_summary,
  created_at,
  updated_at
 FROM links_data 

 UNION

 SELECT  id,
   link_rcvd_id,
   link_origin_id,
   link_rcvd_id,
   link_type,
   link_summary,
   created_at,
   updated_at
 FROM links_data

Вид работает отлично. Обратите внимание, что представление создает дополнительный столбец person_id, которого нет в базовой таблице.

У меня проблемы с созданием правил postgres, которые будут редактировать основную таблицу.

В частности, я могу успешно редактировать табличное представление, когда оно не является представлением UNION. Но вот что происходит, когда я пытаюсь написать правило с представлением UNION:

CREATE RULE inverse_links AS ON INSERT TO links DO INSTEAD
INSERT INTO links_data
  (id, link_origin_id, link_type, link_summary, link_rcvd_id, created_at, 
   updated_at)

VALUES (nextval('people_id_seq'), new.link_origin_id, new.link_type, 
        new.link_summary, new.link_rcvd_id, new.created_at, new.updated_at)

RETURNING *;

Приведенное выше правило должно перенаправлять изменения в базовую таблицу links_data.

Но я получаю следующую ошибку:

ERROR:  RETURNING list's entry 3 has different type from column "link_origin_id"

********** Error **********

ERROR: RETURNING list's entry 3 has different type from column "link_origin_id"
SQL state: 42P17

Возможно, проблема заключается в том, что 1) в представлении есть дополнительный столбец, из-за которого типы столбцов не совпадают, или 2) возможно, что-то связано с тем, что таблица сама по себе является UNION и редактирование этого может быть проблемой.

Есть идеи, куда я могу пойти с этим?

1 Ответ

0 голосов
/ 02 июля 2010

Отказ от ответственности: почти нет опыта работы с обновляемыми представлениями.

Ваше предложение RETURNING является проблемой - таблица links_data, скорее всего, имеет 7 столбцов (как показано вашим определением представления и правилом ON INSERT), и вы возвращаете их содержимое для только что вставленной строки с помощью RETURNING * но у вас есть 8 столбцов. Проверьте и синхронизируйте эти два списка.

...