7
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

4 に答える 4

12

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
于 2009-12-23T23:59:54.760 に答える
5

問題は MySQL のマニュアルに明確に記載されています

現在、サブクエリでテーブルを更新して同じテーブルから選択することはできません。

トランザクションを使用する必要があります。AutoCommit をオフにして、トランザクションを開始してから、SELECT MIN(pos)-1 FROM forms FOR UPDATE を実行し、その結果を取得して更新し、トランザクションをコミットします。

于 2009-12-23T23:58:00.827 に答える
1

あなたも試すことができます:

START TRANSACTION;
SET @newMin := MIN(pos)-1 FROM forms;
UPDATE forms SET pos=@newMin WHERE id='$id';
COMMIT;
于 2009-12-24T00:00:58.970 に答える
1

update文内でサブクエリを使うことはできないと思いますが、どうにか回避策があれば...

以下は以下のサイトからの引用です。

"dev.mysql.com"

「現在、サブクエリでテーブルから削除して同じテーブルから選択することはできません」</p>

于 2009-12-25T14:46:46.087 に答える