web-dev-qa-db-fra.com

MySQL # 1093 - Vous ne pouvez pas spécifier de "cadeaux" pour la mise à jour de la table cible dans la clause FROM

J'ai essayé:

UPDATE giveaways SET winner = '1' WHERE ID = (SELECT MAX(ID) FROM giveaways)

Mais cela donne:

# 1093 - Vous ne pouvez pas spécifier de "cadeaux" pour la mise à jour dans la clause FROM

Cet article semble pertinent mais je ne peux pas l'adapter à ma requête. Comment puis-je le faire fonctionner?

26
Eray

Ceci est dû au fait que votre mise à jour peut être cyclique ... et si la mise à jour de cet enregistrement entraîne un événement qui a rendu la condition WHERE _____ FALSE? Vous savez que ce n'est pas le cas, mais pas le moteur. Il pourrait également y avoir des serrures opposées sur la table lors de l'opération.

Je pense que vous pourriez le faire comme ceci (non testé):

UPDATE
    giveaways
SET
    winner = '1'
ORDER BY
    id DESC
LIMIT 1

Lire la suite

28
Matthew

Selon les informations contenues dans l'article que vous avez lié à cela devrait fonctionner: 

update giveaways set winner='1'
where Id = (select Id from (select max(Id) as id from giveaways) as t)
37
ipr101
update giveaways set winner=1 
where Id = (select*from (select max(Id)from giveaways)as t)
13
Nicola Cossu
create table GIVEAWAYS_NEW as(select*from giveaways);

update giveaways set winner=1
where Id=(select max(Id)from GIVEAWAYS_NEW);
0
Tarun

Vous pouvez d'abord créer une vue de la sous-requête et mettre à jour/supprimer la sélection dans la vue à la place de ..

0
Rafael

Faire usage de TEMP TABLE: 

comme suit:

UPDATE TABLE_NAME SET TABLE_NAME.IsActive=TRUE
WHERE TABLE_NAME.Id IN (
    SELECT Id
    FROM TEMPDATA
);

CREATE TEMPORARY TABLE TEMPDATA
SELECT MAX(TABLE_NAME.Id) as Id
FROM TABLE_NAME
GROUP BY TABLE_NAME.IncidentId;

SELECT * FROM TEMPDATA;

DROP TABLE TEMPDATA;
0
DARSHAN SHINDE