условный UPDATE

iceman

говнокодер
условный UPDATE

UPDATE racms_modules_content_catalog
SET position=IF(position = (SELECT MAX(position) FROM racms_modules_content_catalog limit 1), position, position+1)
WHERE id=23 LIMIT 1;

т.е. если данный каталог уже имеет максимальную позицию, то не увеличивать ее, иначе увеличить...

только данный код выдает ошибку:

You can't specify target table 'racms_modules_content_catalog' for update in FROM clause
 

Wicked

Новичок
*саркастически* спасибо за информацию .-)

тебя интересует, как это побороть? в 2 запроса, обернутых в транзакцию.
 

iceman

говнокодер
это я так понимаю mysql не поддерживает использование одной и той же таблицы в UPDATE + SELECT

ну а как решить мне эту проблему?

это каталог, порядок вывода которого можно менять...

-~{}~ 30.07.08 10:47:

а ладно, сделал используя несколько запросов...

ну все равно кто делал такое, отзовитесь и подскажите...
 

Wicked

Новичок
это я так понимаю mysql не поддерживает использование одной и той же таблицы в UPDATE + SELECT

ну а как решить мне эту проблему?
скачать сорцы mysql, пофиксить эту проблему, отослать патч.
 

Gas

может по одной?
Wicked
только если транзакция используется чтоб паралельный процесс не прочитал то-же значение position, то она не поможет, нужно или select... for update, или поднять уровень изоляции до serialize (первый вариант явно лучше).

updated: не, ф топку serialize.
 

iceman

говнокодер
SELECT counter_field FROM child_codes FOR UPDATE;
UPDATE child_codes SET counter_field = counter_field + 1;

в php разве 2 запроса выполнятся?
 

Gas

может по одной?
в php разве 2 запроса выполнятся?
непонятный вопрос.
sql запросы выполняет база данных, да это 2 запроса, для этого случая нужно даже не 2 запроса, а 4 - Wicked пример написал и естественно таблица должна быть innodb;

но тебе точно нужны все эти "сложности"? если одновременно position обновится 2-мя процесами и увеличится не на 2, а на 1, то это действительно проблема для твоего приложения или нет?
 
Сверху