Mysql Порядок выполнения запроса UPDATE

Фанат

oncle terrible
Команда форума
Пишу я, значит, такой, примерно, запрос:

PHP:
UPDATE t SET parent=1, path=concat(path,parent);
на практике значение parent берётся подставленное в этот запрос, а не лежащее в данный момент в БД.

Вопрос:такое поведение где-то задокументировано? Я могу на него рассчитывать?
 

флоппик

promotor fidei
Команда форума
Партнер клуба
http://dev.mysql.com/doc/refman/5.0/en/update.html
If you access a column from the table to be updated in an expression, UPDATE uses the current value of the column. For example, the following statement sets col1 to one more than its current value:
UPDATE t1 SET col1 = col1 + 1;

The second assignment in the following statement sets col2 to the current (updated) col1 value, not the original col1 value. The result is that col1 and col2 have the same value. This behavior differs from standard SQL.
UPDATE t1 SET col1 = col1 + 1, col2 = col1;
Single-table UPDATE assignments are generally evaluated from left to right. For multiple-table updates, there is no guarantee that assignments are carried out in any particular order.
Когда уже ты научишься пользоваться гуглом? ©
 

Фанат

oncle terrible
Команда форума
флоппик, тебе удалось меня уесть наконец-то :)
ради одного этого стоило задать этот вопрос :-Р
 
  • Like
Реакции: craz

флоппик

promotor fidei
Команда форума
Партнер клуба
Не было цели уесть. Так, поддеть слегка, что бы помнил, что даже ты — не идеален. ;)
 

HEm

Сетевой бобер
ну вот, сейчас у кого то произойдет разрыв шаблона ;)
 

Baton

Новичок
Рискую нарваться, т.к. не по теме но близко. Есть такой запрос - REPLACE, работает как INSERT или UPDATE, в зависимости от наличия записи в таблице. Так вот запрос:

PHP:
REPLACE `table` SET id=1, count=count+1
НЕ увеличивает count на единицу если запись с таким id=1 была, а делает его равным DEFAULT(count).

Хотя при наличии записи этот фактически:

PHP:
UPDATE `table` SET  count=count+1 WHERE id=1
Он то count на 1 увеличит.

Жаль, было бы гораздо удобнее чтобы при REPLACE бралось прежнее значение из таблицы в случае наличия записи.

ЗЫ: зачем написал? Был удивлен таким поведением и делюсь с уважаемой публикой.
 

fixxxer

К.О.
Партнер клуба
все правильно, replace это delete+insert

"как insert или update" делается через insert...on duplicate key update
 

newARTix

Новичок
по теме: Жесть, реально? И кто до этого додумался? Убил бы. Разрыв шаблона у меня. Благо никогда не юзал такие неоднозначные конструкции, но как раз собирался...
 

WMix

герр M:)ller
Партнер клуба
можно легко написать,
PHP:
create trigger t_update before update on t for each row
select concat(path,parent) into new.path where ...;
end
 
Сверху