ВЫБОР Mysql в ОБНОВЛЕНИИ

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

5
задан OMG Ponies 13 July 2011 в 03:12
поделиться

4 ответа

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
10
ответ дан 18 December 2019 в 11:57
поделиться

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

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

Вы хотите использовать транзакцию. Выключите AutoCommit, начните транзакцию, затем выполните команду SELECT MIN (pos) -1 FROM FROM FOR UPDATE, возьмите этот результат, выполните обновление с ним, затем зафиксируйте транзакцию.

4
ответ дан 18 December 2019 в 11:57
поделиться

Чтобы ответить на конкретные вопросы.

«Могу ли я использовать пакет multiprocessing или пакет subprocess ] для запуска нового процесса?»

Использовать multiprocessing

«Как мне получить простой доступ к данным моделирования из процесса графического интерфейса пользователя?»

У вас нет доступа к объектам процессов моделирования, если вы об этом спрашиваете. Моделирование - это отдельный процесс. Вы можете запустить его, остановить и, что наиболее важно, сделать запросы через очередь команд, которые поступают в симулятор.

«Пользователь должен иметь возможность легко и плавно просматривать временную шкалу симуляции. Как можно ли это сделать? »

Это просто дизайн. Один процесс, несколько процессов, несколько потоков вообще не влияют на этот вопрос.

Каждая симуляция должна иметь некоторые параметры, она должна запускаться, она должна создавать журнал (или временную шкалу). Это должно быть сделано независимо от того, какую библиотеку вы используете для запуска и остановки симуляции.

Выходные данные симуляции - которые вводятся в ваш графический интерфейс - могут быть выполнены миллионами способов.

  • База данных. Временную шкалу моделирования можно вставить в базу данных SQLite и запросить через графический интерфейс. Это не очень хорошо работает, потому что SQLite не имеет действительно умной блокировки. Но это работает.

  • File. Временная шкала моделирования записывается в файл. Графический интерфейс читает файл. Это действительно очень хорошо работает.

  • Запрос / ответ. Симуляция имеет несколько потоков, один из которых выводит команды из очереди и отвечает, например, отправляя назад временную шкалу на текущий момент, или останавливая симуляцию, или изменяя параметры и перезапуская ее.

1
ответ дан 18 December 2019 в 11:57
поделиться

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

START TRANSACTION;
SET @newMin := MIN(pos)-1 FROM forms;
UPDATE forms SET pos=@newMin WHERE id='$id';
COMMIT;
0
ответ дан 18 December 2019 в 11:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: