MySQL # 1093 - Вы не можете указать целевую таблицу «раздач» для обновления в предложении FROM - PullRequest
26 голосов
/ 01 декабря 2011

Я пытался:

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

Но это дает:

# 1093 - Вы не можете указать целевую таблицу «раздачи» для обновления в FROM предложении

Эта статья кажется актуальной, но я не могу адаптировать ее к своему запросу. Как мне заставить его работать?

Ответы [ 6 ]

38 голосов
/ 01 декабря 2011

На основании информации в статье, на которую вы ссылаетесь, должно работать:

update giveaways set winner='1'
where Id = (select Id from (select max(Id) as id from giveaways) as t)
28 голосов
/ 01 декабря 2011

Это потому, что ваше обновление может быть цикличным ... что если обновление этой записи вызовет что-то, что привело к условию WHERE FALSE? Вы знаете, что это не так, но двигатель - нет. В операции также могут быть противоположные блокировки на столе.

Я думаю, вы могли бы сделать это так (не проверено):

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

Подробнее

13 голосов
/ 01 декабря 2011
update giveaways set winner=1 
where Id = (select*from (select max(Id)from giveaways)as t)
0 голосов
/ 11 июля 2016

Вы можете сначала создать представление подзапроса и вместо этого обновить / удалить выбор из представления. Просто не забудьте удалить представление после.

0 голосов
/ 11 января 2016

Используйте TEMP TABLE:

следующим образом:

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 голосов
/ 28 ноября 2014
create table GIVEAWAYS_NEW as(select*from giveaways);

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