Lists: | pgsql-ru-general |
---|
From: | "Dmitry E(dot) Oboukhov" <unera(at)debian(dot)org> |
---|---|
To: | pgsql-ru-general(at)postgresql(dot)org |
Subject: | Rule'ы и ссылки на другие таблицы |
Date: | 2011-09-19 07:50:55 |
Message-ID: | 20110919075054.GB14612@apache.rbscorp.ru |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-ru-general |
Имеем табличку 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?
--
. ''`. Dmitry E. Oboukhov
: :’ : email: unera(at)debian(dot)org jabber://UNera(at)uvw(dot)ru
`. `~’ GPGKey: 1024D / F8E26537 2006-11-21
`- 1B23 D4F8 8EC0 D902 0555 E438 AB8C 00CF F8E2 6537
From: | "Andrey N(dot) Oktyabrski" <ano(at)bestmx(dot)ru> |
---|---|
To: | pgsql-ru-general(at)postgresql(dot)org |
Subject: | Re: Rule'ы и ссылки на другие таблицы |
Date: | 2011-09-19 09:04:28 |
Message-ID: | 4E77059C.6000407@bestmx.ru |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-ru-general |
On 19.09.11 11:50, Dmitry E. Oboukhov wrote:
> Вопрос: как можно средствами БД заполнять табличку last_events?
Я бы сделал триггером на insert в events.
From: | "Dmitry E(dot) Oboukhov" <unera(at)debian(dot)org> |
---|---|
To: | pgsql-ru-general(at)postgresql(dot)org |
Subject: | Re: Rule'ы и ссылки на другие таблицы |
Date: | 2011-09-19 12:29:09 |
Message-ID: | 20110919122908.GC14612@apache.rbscorp.ru |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-ru-general |
> On 19.09.11 11:50, Dmitry E. Oboukhov wrote:
>> Вопрос: как можно средствами БД заполнять табличку last_events?
> Я бы сделал триггером на insert в events.
Триггером работает. Мне просто интересно было сделать RULE'ом,
поскольку RULE не требует выделенной функции под это дело. :)
--
. ''`. Dmitry E. Oboukhov
: :’ : email: unera(at)debian(dot)org jabber://UNera(at)uvw(dot)ru
`. `~’ GPGKey: 1024D / F8E26537 2006-11-21
`- 1B23 D4F8 8EC0 D902 0555 E438 AB8C 00CF F8E2 6537
From: | Dmitriy Igrishin <dmitigr(at)gmail(dot)com> |
---|---|
To: | "Dmitry E(dot) Oboukhov" <unera(at)debian(dot)org> |
Cc: | pgsql-ru-general(at)postgresql(dot)org |
Subject: | Re: [pgsql-ru-general] Rule'ы и ссылки на другие таблицы |
Date: | 2011-09-19 18:50:50 |
Message-ID: | CAAfz9KNybu6uFp1n_zoZUfteyXuhL-92+YNLjJ2kqhu8vkt_4g@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | Postg토토 사이트 순위SQL |
Привет,
19 сентября 2011 г. 11:50 пользователь Dmitry E. Oboukhov
<unera(at)debian(dot)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.