MySQL #1093 - Vous ne pouvez pas spécifier une cible de la table des cadeaux pour la mise à jour dans la clause from
J'ai essayé:
UPDATE giveaways SET winner = '1' WHERE ID = (SELECT MAX(ID) FROM giveaways)
Mais elle donne:
#1093 - Vous ne pouvez pas spécifier une cible de la table des cadeaux pour la mise à jour en
FROM
clause
Cet article semble pertinente, mais je ne peux pas l'adapter à ma requête. Comment puis-je le faire fonctionner?
- Vous êtes en train de faire une requête récursive. Que voulez-vous faire exactement?
- Il y a fews inscrits à des cadeaux de la table. Je veux mettre en cadeau (qui n'a plus grand ID) vainqueur de la colonne 1
- Il est assez évident ce qu'il veut faire.
UPDATE giveaways SET winner = '1' WHERE ID = (SELECT MAX(ID) FROM giveaways)
Vous devez vous connecter pour publier un commentaire.
C'est parce que votre mise à jour peut être cyclique que... si la mise à jour de cet enregistrement provoque quelque chose qui fait la
WHERE
conditionFALSE
? Vous savez qui n'est pas le cas, mais le moteur ne fonctionne pas. Il pourrait également y être opposés à des verrous sur la table dans l'opération.Je pense que vous pourriez faire comme ceci (non testé):
Lire plus
WHERE
conditionFALSE
", Depuis lewhere
clause a déjà été évalué, pourquoi est-ce important? Pourquoi est MySQL qui ne sont pas assez intelligents pour le faire (ipr101 et nick réponse) automatiquement?update t where id=(select max(id)from t)
, il est clair que le planificateur de requête ne devrait pas essayer d'optimiser l'imbrication loin car il peut être vu que(select max(id)from t)
est la requête interne qui doit être exécutée en premier.SELECT
d'elle, forçant le planificateur de requête du comportement. Cela fonctionne, bien sûr, mais est contre le planificateur. C'est le codage par hasard. Vous n'êtes pas dans le contrôle de la façon dont le planificateur de requête comporte et vous ne devriez pas de code pour profiter de sa coïncidence comportement.update t where id=(select max(id)from t)
a un cycle, alors c'est assez simple pour lui de dire à lui-même pour exécuter les sous-requêtes imbriquées premier dans ces cas. Pour les cas où aucune cycles sont détectés, il est libre de combiner les requêtes de toute façon il l'entend tant que les résultats sont referentially transparent.Sur la base des informations dans l'article lié à cette devrait fonctionner:
SELECT *
) , ipr101 est juste l'ID (SELECT id
) . À cause de cela, je pense que ipr101 la solution a plus de performance. Vous savez, j'ai mentionné un article, et dans cet article, l'écrivain à l'aide de sous-requêtes. Je vais tester ta réponse aussi.select max(Id) as id from giveaways
comme une variable et de la consulter via cette variable?start transaction
etcommit
. Alors il n'y aurait pas de conditions de course.create table
et laupdate
.Faire usage de la TABLE temporaire:
comme suit:
Vous pouvez créer une vue de la première sous-requête mettre à jour/supprimer la sélection à partir de la vue à la place..
N'oubliez pas de baisse de la vue après.