у меня есть простая таблица:Postgres правило обновления обыкновение вставлять
CREATE TABLE aaa_has_bbb (
aaa_id integer not null,
bbb_id integer not null,
rank integer not null,
primary key(aaa_id, bbb_id),
uniq(aaa_id, rank)
)
Я пытаюсь создать правило, которое будет удаления и вставки, потому что активирует некоторые соответствующие триггеры.
CREATE OR REPLACE RULE pivot_key_updates AS
ON UPDATE TO aaa_has_bbb
WHERE OLD.aaa_id<>NEW.aaa_id OR OLD.bbb_id<>NEW.bbb_id
DO INSTEAD (
--
-- on update of keys in this pivot table, delete and insert instead
--
DELETE FROM aaa_has_bbb WHERE aaa_id = OLD.aaa_id
AND bbb_id = OLD.bbb_id;
INSERT INTO aaa_has_bbb (aaa_id, bbb_id, rank)
VALUES (NEW.aaa_id, NEW.bbb_id, NEW.rank);
);
Это никогда не вставляет, но успешно удаляет.
Однако, если я в обратном порядке, как это:
CREATE OR REPLACE RULE pivot_key_updates AS
ON UPDATE TO aaa_has_bbb
WHERE OLD.aaa_id<>NEW.aaa_id OR OLD.bbb_id<>NEW.bbb_id
DO INSTEAD (
--
-- on update of keys in this pivot table, delete and insert instead
--
INSERT INTO aaa_has_bbb (aaa_id, bbb_id, rank)
VALUES (NEW.aaa_id, NEW.bbb_id, NEW.rank+1);
DELETE FROM aaa_has_bbb WHERE aaa_id = OLD.aaa_id
AND bbb_id = OLD.bbb_id;
);
Переключение работы порядка? Зачем?
Чтобы сделать эту работу правильно, я должен ранжировать + 1, чтобы избежать столкновения ключей, но я действительно не хочу этого делать.
Что мне не хватает?
EDIT: Я понимаю, что могу облегчить свою жизнь с помощью триггеров, и это, вероятно, то, что я в конечном итоге сделаю, но мне очень любопытно, почему мое правило не работает должным образом.
PostgreSQL версия? Кроме того, определение таблицы не соответствует определению правила 'rank' vs.' ccc'? –
Извините, Эрвин, мой анонимайзер ушел от меня, я исправил все ссылки на ccc -> rank –
Вы * еще * не предоставили свою версию Postgres. –