Re: most idiomatic way to "update or insert"?

Поиск
Список
Период
Сортировка
От Lincoln Yeoh
Тема Re: most idiomatic way to "update or insert"?
Дата
Msg-id 6.1.2.0.1.20040805094112.01bb6ec0@localhost
обсуждение исходный текст
Ответ на Re: most idiomatic way to "update or insert"?  ("Peter Darley" <pdarley@kinesis-cem.com>)
Ответы Re: most idiomatic way to "update or insert"?  (Pierre-Frédéric Caillaud<lists@boutiquenumerique.com>)
Re: most idiomatic way to "update or insert"?  ("Peter Darley" <pdarley@kinesis-cem.com>)
Список pgsql-general
I don't think that works - there's a race condition if you do not do any
locking.

Why:
Before a transaction that inserts rows is committed, other transactions are
not aware of the inserted rows, so the select returns no rows.

So:
You can either create a unique index and catch insert duplicate failures.

Or:
lock the relevant tables, then do the select ... update/insert  or insert
... select , or whatever it is you want to do.

Or:
both.

Test it out yourself.

At 07:51 AM 8/5/2004, Peter Darley wrote:
>Mark,
>         It's not canonical by any means, but what I do is:
>
>update foo set thing='stuff' where name = 'xx' and thing<>'stuff';
>insert into foo (name, thing) (select 'xx' as name, 'stuff' as thing where
>not exists (select 1 from foo where name='xx'));
>
>         I believe if you put these on the same line it will be a single
>transaction.  It has the benefit of not updating the row if there aren't
>real changes.  It's plenty quick too, if name is indexed.
>
>Thanks,
>Peter Darley



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

Предыдущее
От: Greg Stark
Дата:
Сообщение: Re: most idiomatic way to "update or insert"?
Следующее
От: Gunasekaran Balakrishnan
Дата:
Сообщение: Re: Test case for bug fix in 7.4.3