Код ошибки mysql 1093: вы не можете указать целевую таблицу для обновления в предложении from

Возможно, я делаю что-то не так, я искал это раньше и нахожу некоторые обходные пути, которые говорят мне, что это невозможно в MySQL, другие публикуют, что это связано с оптимизатором MySQL, поэтому вы можете просто выключить его и продолжить, но со мной это не работает.

Мне нужен только простой обходной путь, чтобы справиться с этим. Единственная таблица, в которой я могу найти id_address_delivery и id_address_invoice, - это таблица заказов, эти данные также находятся в других таблицах, но могут быть нулевыми, поэтому нет возможности искать их в другом месте.

SET optimizer_switch = 'derived_merge=off';

update orders 
set id_customer = (select id_customer from customer where email like 'foo@foo.com'),
id_address_delivery = (select id_address_delivery from orders where id_customer = (select id_customer from customer where email like 'foo@foo.com') LIMIT 1),
id_address_invoice = (select id_address_invoice from orders where id_customer = (select id_customer from customer where email like 'foo@foo.com') LIMIT 1)
where id_customer = (select id_customer from customer where email like 'foo2@foo2.com');

я получаю Код ошибки: 1093. Вы не можете указать "заказы" целевой таблицы для обновления в предложении FROM. на рабочей среде mysql, даже если я приложу

SET optimizer_switch = 'derived_merge=off';

Есть ли какой-нибудь вариант, как справиться с этой ситуацией? Я благодарю за установку некоторых варов, например:

SET @iad = (select id_address_delivery from orders where id_customer = (select id_customer from customer where email like 'foo@foo.com') LIMIT 1);

затем установите эту переменную как значение, например:

id_address_delivery = @iad;

Я не получаю ответ об ошибке при этом, но это длится очень много (я точно не знаю почему), и появляется сообщение о таймауте (30 секунд). Я попытался поставить его на 120 секунд и получить такое же сообщение о тайм-ауте.

Обновлено:

Я пробовал использовать псевдоним, но безрезультатно. Та же ошибка:

update orders AS sor
set sor.id_customer = (select id_customer from customer where email like 'foo@foo.com'),
sor.id_address_delivery = (select a.id_address_delivery from orders as a where a.id_customer = (select id_customer from customer where email like 'foo@foo.com') LIMIT 1),
sor.id_address_invoice = (select b.id_address_invoice from orders as b where b.id_customer = (select id_customer from customer where email like 'foo@foo.com') LIMIT 1)
where pso.id_customer = (select id_customer from customer where email like 'foo2@foo2.com');

/Обновлено:

Я прочитал несколько сообщений, помеченных как та же проблема, но там я нахожу обходные пути для других пунктов и не могу понять, как применить то же самое в моем конкретном случае.

Как я могу продолжить? Спасибо.

Я прочитал этот пост перед тем, как спросить, он не решает мою проблему или, по крайней мере, я не могу понять, как применить этот обходной путь в моем конкретном случае.

Joel Bonet Rodríguez 10.09.2018 12:38

Согласно связанному ответу, заключите запрос в подзапрос, то есть (select * from (select id_address_delivery from orders ...)).

Nick 10.09.2018 12:43
1
3
3 483
3

Ответы 3

В качестве другого ответа, если вы выполняете UPDATE / INSERT / DELETE в таблице, вы не можете ссылаться на эту таблицу во внутреннем запросе (однако вы можете ссылаться на поле из этой внешней таблицы ...)

Отметьте ниже вопросы, относящиеся к вашей проблеме, и они решены.

Ошибка MySQL 1093 - невозможно указать целевую таблицу для обновления в предложении FROM

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

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

Nico Haase 10.09.2018 13:58

Я наконец разобрался с этим, установив vars, до сих пор не знаю, почему это вызывало тайм-аут раньше. Я добавил нулевую защиту для предложения where, чтобы не вставлять нулевые значения в случае сбоя какой-либо var init.

Для вашего интереса есть копия моего рабочего примера:

use dbname;

SET SQL_SAFE_UPDATES = 0;
SET optimizer_switch = 'derived_merge=off';

#-- data asociated with wrong@foomail.com will be associated to correct@foomail.com

SET @delad = (SELECT id_address_delivery FROM orders WHERE customer = (SELECT id_customer FROM customer WHERE email LIKE 'correct@foomail.com') LIMIT 1);
SET @delin = (SELECT id_address_invoice FROM orders WHERE id_customer = (SELECT id_customer FROM customer WHERE email LIKE 'correct@foomail.com') LIMIT 1);
SET @uid = (SELECT id_customer FROM customer WHERE email LIKE 'correct@foomail.com' LIMIT 1);
SET @buid = (SELECT id_customer FROM customer WHERE email LIKE 'wrong@foomail.com' LIMIT 1);

UPDATE orders
SET id_customer = @uid,
id_address_delivery = @delad,
id_address_invoice = @delin
WHERE @uid is not null AND @delad is not null AND @delin is not null AND id_customer = @buid;

UPDATE cart SET
 id_customer = @uid,
 id_address_delivery = @delad,
 id_address_invoice = @delin
 WHERE @buid is not null AND @uid is not null AND @delad is not null AND @delin is not null AND id_customer = @buid;

Это всего лишь абстракция значения подзапроса в переменную и размещение его в той точке, где будет подзапрос. Я делал это раньше без необходимости в этом обходном пути, но я думаю, что это было на сервере sql (возможно).

Надеюсь, это кому-то поможет.

create view foo_data as ( select o.id_customer,o.id_address_delivery,o.id_address_invoice from  orders as o inner join customer as c on o.id_customer = c.id_customer where c.email like 'foo@foo.com' limit 1)    


update orders as o inner join foo_data as f on f.id_customer = o.id_customer
set optimizer_switch = 'derived_merge=off',
set o.id_customer = f.id_customer,
set o.id_address_delivery  = f.id_address_delivery ,
set o.id_address_invoice = f.id_address_invoice,
where o.email email like 'foo2@foo2.com';

drop view foo_data;

Please try using creating temp view

Можете ли вы добавить пояснения к своему коду, чтобы другие могли извлечь из него уроки?

Nico Haase 10.09.2018 13:57

Другие вопросы по теме