Re: Switching from MySQL: ON DUPLICATE KEY UPDATE, plpgsql function

Поиск
Список
Период
Сортировка
От APseudoUtopia
Тема Re: Switching from MySQL: ON DUPLICATE KEY UPDATE, plpgsql function
Дата
Msg-id 27ade5280906301325u49e889e6v9ca239a6873d3348@mail.gmail.com
обсуждение исходный текст
Ответ на Re: Switching from MySQL: ON DUPLICATE KEY UPDATE, plpgsql function  (David Kerr <dmk@mr-paradox.net>)
Ответы Re: Switching from MySQL: ON DUPLICATE KEY UPDATE, plpgsql function  ("Chris Spotts" <rfusca@gmail.com>)
Список pgsql-general
On Mon, Jun 29, 2009 at 2:26 PM, David Kerr<dmk@mr-paradox.net> wrote:
> On Sat, Jun 27, 2009 at 08:23:26PM -0400, APseudoUtopia wrote:
> - Hey list,
> -
> - I'm migrating my site away from MySQL to PostgreSQL. So far, it's been
> - going great. However, there's one problem I've been having trouble
> - solving.
> -
> - I have a query which allows users to "Catch up" on read posts on the
> - forum. It works by either updating or inserting the "last post read"
> - number from every forum thread into the readposts table (for that
> - userid and threadid combination, of course). Here's the table
> - structure:
> -
> - CREATE TABLE "forums_readposts" (
> -  "userid"    INTEGER NOT NULL REFERENCES "users_main" ("id") ON DELETE CASCADE,
> -  "threadid"    INTEGER NOT NULL REFERENCES "forums_topics" ("id") ON
> - DELETE CASCADE,
> -  "lastpostread"   INTEGER NOT NULL CHECK ("lastpostread" >= 0),
> -  PRIMARY KEY ("userid", "threadid")
> - );
> -
> - Here's the original MySQL query that I have (db_string is a php
> - function that escapes the string):
> -
> - INSERT INTO "forums_readposts" ("userid", "threadid", "lastpostread")
> - SELECT ' . db_string($_SESSION['UserInfo']['id']) . ', "id",
> - "lastpost" FROM "forums_topics" ON DUPLICATE KEY UPDATE "lastpostread"
> - = "lastpost";
>
> So regardless of other design issues. (i.e., assuming what you have was working
> in MySQL).
>
> Wouldn't you just be looking for something like:
>
> BEGIN;
>  EXECUTE 'insert into forums_readposts values ('...')';
>        EXCEPTION when unique_violation THEN
>                EXECUTE 'update forums_readposts set lastpostread = '...' ';
> END;
>
> The logic as i read your post is. If the user's never done a "catchup" operation
> before, this will create the record. If he has, then it will update this record
> to reflect the new transid.
>
> Dave
>

Hmm, yeah. I'm new to PostgreSQL, and have little experience with
MySQL other than basic queries and joins. I didn't get to the part in
the docs that covers EXECUTE yet, haha. That looks like it would do
exactly what I want it to.

I appreciate it.

В списке pgsql-general по дате отправления:

Предыдущее
От: BJ Freeman
Дата:
Сообщение: Re: another can't connect--solved
Следующее
От: Erik Jones
Дата:
Сообщение: Re: