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

@balusC Я сделал, как вы писали. В моем случае я добавил данные cookie для повторного использования сеанса.

   // get the cookie if need
    String cookies = conn.getHeaderField("Set-Cookie");

    // open the new connnection again
    conn = (HttpURLConnection) new URL(newUrl).openConnection();
    conn.setRequestProperty("Cookie", cookies);
535
задан shA.t 31 May 2015 в 09:35
поделиться

4 ответа

Обновление: Этот ответ касается общей классификации ошибок. Для более определенного ответа о том, как лучше всего обработать точный запрос OP, см. другие ответы на этот вопрос

MySQL In, Вы не можете изменить ту же таблицу, которую Вы используете в ИЗБРАННОЙ части.
Это поведение документируется в: http://dev.mysql.com/doc/refman/5.6/en/update.html

, Возможно, можно просто соединить таблицу с собой

, Если логика достаточно проста изменить запрос, потерять подзапрос и соединить таблицу с собой, используя соответствующие критерии выбора. Это заставит MySQL рассматривать таблицу как две разных вещи, позволяя разрушительным изменениям идти вперед.

UPDATE tbl AS a
INNER JOIN tbl AS b ON ....
SET a.col = b.col

, С другой стороны, вложение попытки подзапрос глубже в из пункта...

при абсолютной необходимости в подзапросе существует обходное решение, но это ужасно по нескольким причинам, включая производительность:

UPDATE tbl SET col = (
  SELECT ... FROM (SELECT.... FROM) AS x);

вложенный подзапрос в ИЗ пункта создает неявная временная таблица , таким образом, это не рассчитывает как та же таблица, Вы обновляете.

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

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

SET optimizer_switch = 'derived_merge=off';

Благодаря Peter V. MГёrch для этого совета в комментариях.

метод В качестве примера был от Baron Schwartz, первоначально опубликован в Nabble, перефразируемом и расширенном здесь.

670
ответ дан Community 31 May 2015 в 09:35
поделиться

Вы могли вставить идентификаторы желаемых строк во временную таблицу и затем удалить все строки, которые найдены в той таблице.

, который может быть тем, какой @Cheekysoft подразумевал под выполнением его на двух шагах.

5
ответ дан YonahW 31 May 2015 в 09:35
поделиться

Если что-то не работает, когда проникающий через парадную дверь, то возьмите бэкдор:

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;

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

2
ответ дан 22 November 2019 в 22:16
поделиться

Внутреннее соединение в вашем подзапросе не нужно. Похоже, вы хотите удалить записи в story_category , где category_id не находится в таблице category .

Сделайте следующее:

DELETE FROM story_category 
WHERE category_id NOT IN (
    SELECT DISTINCT category.id 
    FROM category);

Вместо что:

DELETE FROM story_category 
WHERE category_id NOT IN (
    SELECT DISTINCT category.id 
    FROM category INNER JOIN
         story_category ON category_id=category.id);
104
ответ дан 22 November 2019 в 22:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: