Re: [pgsql-ru-general] Rule'ы и ссылки на другие таблицы - Mailing list pgsql-ru-general

From Dmitriy Igrishin
Subject Re: [pgsql-ru-general] Rule'ы и ссылки на другие таблицы
Date
Msg-id CAAfz9KNybu6uFp1n_zoZUfteyXuhL-92+YNLjJ2kqhu8vkt_4g@mail.gmail.com
Whole thread Raw
List pgsql-ru-general
Привет,

19 сентября 2011 г. 11:50 пользователь Dmitry E. Oboukhov <unera@debian.org> написал:
Имеем табличку users:

 | user_id | какие-то поля |

Далее имеем табличку событий events:

 | event_id | user_id REFERENCES users ("id") | time | какие-то поля |


То есть события поступают и записываются со ссылками на пользователя с
текущим временем.

теперь чтобы выбрать все события 25-го пользователя надо сказать

   SELECT * FROM events WHERE user_id = 25;

А чтобы выбрать последнее событие 25-го пользователя надо сказать

   SELECT * FROM events WHERE id = 25 ORDER BY time DESC LIMIT 1;

Далее потребовалось выводить список пользователей в одной колонке,
список последних их событий в другой.

Поскольку получаются подзапросы, то хочется завести табличку
last_events:

 | user_id REFERENCES "users" ("user_id") | event_id REFERENCES "events" ("event_id") |

Теперь хочется чтобы эту табличку правила сама база.

CREATE RULE "event_insert" AS ON INSERT TO "events" DO ALSO
   UPDATE
       "last_events"
   SET "event_id" = NEW."event_id"
   WHERE "user_id" = NEW."user_id";

Вот, а тепрерь если попробовать добавить запись в events то получаем
исключение о том что поскольку event_id еще некорректный (транзакция
еще незавершена), то и стало быть запись не проходит.

Вопрос: как можно средствами БД заполнять табличку last_events?

Можно сделать проверку целостности отложенной (при создании связи
нужно использовать ключевое слово DEFERRABLE) и управлять транзакцией
явно.
http://www.postgresql.org/docs/9.1/static/sql-createtable.html
А еще можно использовать SET TRANSACTION
http://www.postgresql.org/docs/9.1/static/sql-set-transaction.html
 

--
// Dmitriy.


pgsql-ru-general by date:

Previous
From: "Dmitry E. Oboukhov"
Date:
Subject: Re: Rule'ы и ссылки на другие таблицы
Next
From: Alexey Klyukin
Date:
Subject: Re: [pgsql-ru-general] Косяки с отменой летнего времени