Mysql ВЫБРАТЬ внутри ОБНОВЛЕНИЕ - PullRequest
5 голосов
/ 24 декабря 2009
UPDATE forms SET

pos = (SELECT MIN(pos)-1 FROM forms)

WHERE id=$id

Это не работает, сообщение об ошибке:

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

Надеюсь, это понятно: я хочу получить минимальный элемент-1 из той же таблицы и назначить его для pos

Ответы [ 4 ]

10 голосов
/ 24 декабря 2009

Consp прав, что он не поддерживается. Однако есть обходной путь:

UPDATE forms SET
pos = (SELECT MIN(pos)-1 FROM (SELECT * FROM forms) AS x)
WHERE id=$id

Версия, которая, вероятно, быстрее:

UPDATE forms 
SET pos = (SELECT pos-1 FROM (SELECT MIN(pos) AS pos FROM forms) AS x)
where id=$id
4 голосов
/ 24 декабря 2009

Ваша проблема четко изложена в руководстве по MySQL :

В настоящее время вы не можете обновить таблицу и выбрать одну и ту же таблицу в подзапросе.

Вы хотите использовать транзакцию. Выключите AutoCommit, начните транзакцию, затем выполните SELECT MIN (pos) -1 FROM для ОБНОВЛЕНИЯ, возьмите этот результат, выполните обновление с ним, затем подтвердите транзакцию.

1 голос
/ 25 декабря 2009

Я думаю, что вы не можете использовать подзапрос внутри оператора обновления, но в любом случае для этого есть обходные пути ...

Вот цитата со следующего сайта:

"dev.mysql.com"

«В настоящее время вы не можете удалить из таблицы и выбрать из той же таблицы в подзапросе»

0 голосов
/ 24 декабря 2009

Вы также можете попробовать:

START TRANSACTION;
SET @newMin := MIN(pos)-1 FROM forms;
UPDATE forms SET pos=@newMin WHERE id='$id';
COMMIT;
...