Я пытаюсь написать правило для представления для удаления кортежей из таблиц компонентов, но пока могу удалять только данные от одного из них. Я' Я какое-то время использовал postgres с базовыми представлениями, но у меня нет опыта работы с правилами для представлений.
Я написал дурацкий небольшой тестовый пример, чтобы выяснить / показать мою проблему. В этом примере есть только один родительский кортеж на каждый дочерний кортеж (моя фактическая схема, конечно, не такая).
Таблицы компонентов:
CREATE TABLE parent(
id serial PRIMARY KEY,
p_data integer NOT NULL UNIQUE
);
CREATE TABLE child(
id serial PRIMARY KEY,
parent_id integer NOT NULL UNIQUE REFERENCES parent(id),
c_data integer NOT NULL
);
Представление:
CREATE TABLE child_view(
id integer,
p_data integer,
c_data integer
);
CREATE RULE "_RETURN" AS ON SELECT TO child_view DO INSTEAD
SELECT child.id, p_data, c_data
FROM parent JOIN child ON (parent_id=parent.id);
Правило удаления проблемы
CREATE RULE child_delete AS ON DELETE TO child_view DO INSTEAD(
DELETE FROM child WHERE id=OLD.id;
DELETE FROM parent WHERE p_data=OLD.p_data;
);
Цель вышеизложенного Правило состоит в том, чтобы удалить кортежи, на которые есть ссылки в представлении, из таблиц компонентов. WHERE p_data = OLD.p_data
кажется мне странным, но я не вижу, как еще ссылаться на желаемый кортеж в родительской таблице.
Вот что происходит, когда я пытаюсь использовать указанное выше правило :
>SELECT * FROM child_view;
id | p_data | c_data
----+--------+--------
1 | 1 | 10
2 | 2 | 11
3 | 3 | 12
(3 rows)
>DELETE FROM child_view WHERE id=3;
DELETE 0
>SELECT * FROM child_view;
id | p_data | c_data
----+--------+--------
1 | 1 | 10
2 | 2 | 11
(2 rows)
Но, глядя на родительскую таблицу, вторая часть удаления не работает (id = 3 "должен был быть удален"):
>SELECT * FROM parent;
id | p_data
----+--------
1 | 1
2 | 2
3 | 3
(3 rows)
Как мне написать правило удаления для удаления как дочерних, так и родительских кортежей?
Это используется postgres v9.
Любая помощь приветствуется. Также будут оценены указатели на любые материалы, касающиеся правил для представлений за пределами документации postgres (если я явно что-то не пропустил). Спасибо.
РЕДАКТИРОВАТЬ: как указывает jmz, здесь было бы проще использовать каскадное удаление, чем правило, но этот подход не работает для моей реальной схемы.