7
votes

MySQL Sélectionnez Inside Update

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

0 commentaires

4 Réponses :


5
votes

Votre problème est indiqué clairement dans le manuel MySQL :

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

vous voudrez utiliser une transaction. Tournez l'autocommit d'éteindre, commencez une transaction, puis effectuez un SELECT MIN (POS) -1 de formulaires pour la mise à jour, prenez ce résultat, faites la mise à jour avec elle, puis engagez votre transaction.


0 commentaires

12
votes

CESP est correct que ce n'est pas pris en charge. Il y a une solution de contournement, cependant: xxx

une version probablement plus rapide: xxx


5 commentaires

+1 pour "visser tes restrictions fantaisistes arbitraires". J'espère que ça marche, je n'utilise plus MySQL moi-même.


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


J'ai essayé de le faire un peu plus vite, mais je n'ai pas mesuré la performance. Vous devrez peut-être jouer un peu pour voir ce qui fonctionne mieux pour vos données.


Ce n'est pas une restriction fantaisiste arbitraire ... c'est parce que le Select devrait entraîner un verrouillage des lignes appropriées, mais les lignes sont déjà verrouillées par la relève de la mise à jour, et personne n'a codé la logique de verrouillage correcte sans causer la déclaration potentiellement impatiente. lui-même. - Notez que, en créant une table temporaire que vous sélectionnez dans, cette instruction de mise à jour n'est pas réellement atomique et plusieurs mises à jour avec le même point de vente pourraient potentiellement être faites.


Une telle demande a créé un processus sans fin et mon serveur est devenu indisponible. Cela peut être dû aux fonctionnalités supplémentaires que j'ai incluses dans la demande, mais faites attention. Le Transactions a travaillé pour moi sans aucun problème.



1
votes

Vous pouvez également essayer:

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


1 commentaires

Pour la deuxième ligne de Mariadb doit commencer par Sélectionnez au lieu de SET : mariadb.com/kb/en/start-transaction/#exemples



1
votes

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

Voici une citation du site suivant:

"dev.mysql.com"

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


0 commentaires