MySQL Error 1093 - Не удается указать целевую таблицу для обновления в предложении FROM - PullRequest
526 голосов
/ 05 сентября 2008

В моей базе данных есть таблица story_category с поврежденными записями. Следующий запрос возвращает поврежденные записи:

SELECT * 
FROM  story_category 
WHERE category_id NOT IN (
    SELECT DISTINCT category.id 
    FROM category INNER JOIN 
       story_category ON category_id=category.id);

Я попытался удалить их, выполнив:

DELETE FROM story_category 
WHERE category_id NOT IN (
    SELECT DISTINCT category.id 
    FROM category 
      INNER JOIN story_category ON category_id=category.id);

Но я получаю следующую ошибку:

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

Как я могу преодолеть это?

Ответы [ 14 ]

2 голосов
/ 11 января 2018

Самый простой способ сделать это - использовать псевдоним таблицы, когда вы ссылаетесь на родительскую таблицу запросов внутри подзапроса.

Пример:

insert into xxx_tab (trans_id) values ((select max(trans_id)+1 from xxx_tab));

Измените его на:

insert into xxx_tab (trans_id) values ((select max(P.trans_id)+1 from xxx_tab P));
2 голосов
/ 29 марта 2009

Если что-то не работает, проходя через парадную дверь, возьмите заднюю дверь:

drop table if exists apples;
create table if not exists apples(variety char(10) primary key, price int);

insert into apples values('fuji', 5), ('gala', 6);

drop table if exists apples_new;
create table if not exists apples_new like apples;
insert into apples_new select * from apples;

update apples_new
    set price = (select price from apples where variety = 'gala')
    where variety = 'fuji';
rename table apples to apples_orig;
rename table apples_new to apples;
drop table apples_orig;

Это быстро. Чем больше данных, тем лучше.

1 голос
/ 11 мая 2017

как насчет этого запроса, надеюсь, это поможет

DELETE FROM story_category LEFT JOIN (SELECT category.id FROM category) cat ON story_category.id = cat.id WHERE cat.id IS NULL
1 голос
/ 31 мая 2016

Попробуйте сохранить результат оператора Select в отдельной переменной, а затем используйте его для запроса на удаление.

...