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 に割り当てたい
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 に割り当てたい
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
現在、サブクエリでテーブルを更新して同じテーブルから選択することはできません。
トランザクションを使用する必要があります。AutoCommit をオフにして、トランザクションを開始してから、SELECT MIN(pos)-1 FROM forms FOR UPDATE を実行し、その結果を取得して更新し、トランザクションをコミットします。
あなたも試すことができます:
START TRANSACTION;
SET @newMin := MIN(pos)-1 FROM forms;
UPDATE forms SET pos=@newMin WHERE id='$id';
COMMIT;
update文内でサブクエリを使うことはできないと思いますが、どうにか回避策があれば...
以下は以下のサイトからの引用です。
「現在、サブクエリでテーブルから削除して同じテーブルから選択することはできません」</p>