mysql error code 1093: невозможно указать целевую таблицу для обновления в предложении FROM - PullRequest
0 голосов
/ 10 сентября 2018

Возможно, я что-то делаю не так, я искал это раньше и нахожу некоторые обходные пути, которые говорят мне, что это невозможно в 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 секунд и получить тот же тайм-аут сообщение.

EDIT:

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

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');

/ EDIT:

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

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

Ответы [ 3 ]

0 голосов
/ 10 сентября 2018

Я, наконец, справился с этим, установив переменные, до сих пор не знаю, почему это вызвало тайм-аут раньше. Я добавил нулевую защиту в предложении where, чтобы не вставлять нулевые значения, если не удается выполнить переменную 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 (возможно).

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

0 голосов
/ 10 сентября 2018
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
0 голосов
/ 10 сентября 2018

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

Проверьте ниже вопросы те же ваши проблемы, и они решены.

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

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

...