2009-12-23 8 views
4
UPDATE forms SET 

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

WHERE id=$id 

Cela ne fonctionne pas, le message d'erreur:Mysql SELECT intérieur MISE À JOUR

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

J'espère qu'il est clair: je veux l'élément 1 minimal de la même table et l'affecter à pos

Répondre

9

Consp a raison de dire que ce n'est pas supporté. Il y a une solution, cependant:

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

Une version qui est probablement plus rapide:

UPDATE forms 
SET pos = (SELECT pos-1 FROM (SELECT MIN(pos) AS pos FROM forms) AS x) 
where id=$id 
+0

1 pour « vis vos restrictions arbitraires fantaisistes ». J'espère que cela fonctionne bien, je n'utilise plus mysql moi-même. –

+0

TRAVAIL !!! Respectez MARK !!! – Dan

+0

... les gars n'oublient pas d'utiliser isnull() au cas où la table est vide – Dan

4

Votre problème is stated plainly in the MySQL manual:

Actuellement, vous ne pouvez pas mettre à jour une table et sélectionnez la même table dans une sous-requête.

Vous voudrez utiliser une transaction. Désactivez AutoCommit, commencez une transaction, puis faites un SELECT MIN (pos) -1 FROM FOR FOR UPDATE, prenez ce résultat, faites la mise à jour avec, puis validez votre transaction.

0

Vous pouvez également essayer:

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

Je pense que vous ne pouvez pas utiliser une sous-requête dans un mise à jour déclaration, mais de toute façon il ya des solutions de contournement pour cela ...

Voici une citation de la suite Site de l'aile:

"dev.mysql.com"

« Actuellement, vous ne pouvez pas supprimer d'une table et sélectionnez la même table dans une sous-requête »