В моей базе данных PostgreSQL 9.1 я определил ПРАВИЛА, которые удаляют строки из дочерних таблиц всякий раз, когда удаляется строка родительской таблицы.Все это работало нормально, пока я не ввел наследство.Если родительская (ссылающаяся) таблица INHERITS
из другой таблицы и я удаляю ее из базовой таблицы, то УДАЛЕНИЕ выполняется успешно, но ПРАВИЛО вообще не срабатывает - указанная строка не удаляется.Если я пытаюсь удалить из производной таблицы, я получаю сообщение об ошибке:
update or delete on table "referenced" violates foreign key constraint "fk_derived_referenced" on table "derived"
В родительской таблице нет другой строки, которая нарушала бы внешний ключ: на нее ссылается удаляемая строка!Как это исправить?
Следующий скрипт воспроизводит проблему:
-- Schema
CREATE TABLE base
(
id serial NOT NULL,
name character varying(100),
CONSTRAINT pk_base PRIMARY KEY (id)
);
CREATE TABLE referenced
(
id serial NOT NULL,
value character varying(100),
CONSTRAINT pk_referenced PRIMARY KEY (id)
);
CREATE TABLE derived
(
referenced_id integer,
CONSTRAINT pk_derived PRIMARY KEY (id),
CONSTRAINT fk_derived_referenced FOREIGN KEY (referenced_id) REFERENCES referenced (id)
)
INHERITS (base);
-- The rule
CREATE OR REPLACE RULE rl_derived_delete_referenced
AS ON DELETE TO derived DO ALSO
DELETE FROM referenced r WHERE r.id = old.referenced_id;
-- Some test data
INSERT INTO referenced (id, value)
VALUES (1, 'referenced 1');
INSERT INTO derived (id, name, referenced_id)
VALUES (2, 'derived 2', 1);
-- Delete from base - deletes the "base" and "derived" rows, but not "referenced"
--DELETE FROM base
--WHERE id = 2;
-- Delete from derived - fails with:
-- update or delete on table "referenced" violates foreign key constraint "fk_derived_referenced" on table "derived"
DELETE FROM derived
WHERE id = 2