У меня есть таблица, в которой хранятся ссылки между двумя людьми. Чтобы предотвратить дальнейшие осложнения в будущем для приложения, которое я создаю, я хочу создать редактируемое представление, которое показывает записи ссылок и обратную копию записей ссылок.
То есть, если Джо связан с Салли, то в представлении должно быть показано, что Джо связан с Салли, а Салли связана с Джо.
Итак, я создал СОЮЗ следующим образом:
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 и редактирование этого может быть проблемой.
Есть идеи, куда я могу пойти с этим?