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

Фанат

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

PHP:
UPDATE t SET parent=1, path=concat(path,parent);

на практике значение parent берётся подставленное в этот запрос, а не лежащее в данный момент в БД.

Вопрос:такое поведение где-то задокументировано? Я могу на него рассчитывать?
 
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.

Когда уже ты научишься пользоваться гуглом? ©
 
флоппик, тебе удалось меня уесть наконец-то :)
ради одного этого стоило задать этот вопрос :-Р
 
  • Like
Реакции: craz
Не было цели уесть. Так, поддеть слегка, что бы помнил, что даже ты — не идеален. ;)
 
ну вот, сейчас у кого то произойдет разрыв шаблона ;)
 
Рискую нарваться, т.к. не по теме но близко. Есть такой запрос - 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 бралось прежнее значение из таблицы в случае наличия записи.

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

"как insert или update" делается через insert...on duplicate key update
 
по теме: Жесть, реально? И кто до этого додумался? Убил бы. Разрыв шаблона у меня. Благо никогда не юзал такие неоднозначные конструкции, но как раз собирался...
 
можно легко написать,
PHP:
create trigger t_update before update on t for each row
select concat(path,parent) into new.path where ...;
end
 
Сверху