Re: SELECT MAX(c) FROM (SELECT ... FOR UPDATE) AS foo
От | Jean-Luc Lachance |
---|---|
Тема | Re: SELECT MAX(c) FROM (SELECT ... FOR UPDATE) AS foo |
Дата | |
Msg-id | 41222A26.1080204@sympatico.ca обсуждение исходный текст |
Ответ на | Re: SELECT MAX(c) FROM (SELECT ... FOR UPDATE) AS foo (Markus Bertheau <twanger@bluetwanger.de>) |
Список | pgsql-sql |
If your intent is to insert a new record with position incremented by 1, you should use a trigger. Look at the autoincrement thread from few days ago. Markus Bertheau wrote: > В Втр, 17.08.2004, в 16:12, Bruno Wolff III пишет: > >>>SELECT MAX(position) FROM (SELECT position FROM classes WHERE name = >>>'foo' FOR UPDATE OF classes) AS foo >>> >>>It's clear which rows should be locked here, I think. >> >>Even if it was allowed, it probably wouldn't be good enough because it won't >>protect against newly inserted records. > > > Can you detail an example where this wouldn't be good enough? > > In a PL/pgSQL function I'm doing > > PERFORM position FROM class_fields WHERE class = arg_class_name; > INSERT INTO class_fields (class, field, position) VALUES > (arg_class_name, arg_field_name, (SELECT MAX(position) FROM class_fields > WHERE class = arg_class_name)); > > Is this unsafe? > > The question initially arose because I wanted to do something similar to > > SELECT INTO var_new_position MAX(position) FROM class_fields WHERE class > = arg_class_name FOR UPDATE OF class_fields; > > which didn't work. > > Thanks >
В списке pgsql-sql по дате отправления: