MySQL — популярная система управления реляционными базами данных, используемая многими разработчиками и организациями для эффективного хранения и извлечения данных. Однако когда дело доходит до обновления таблицы данными, полученными из подзапроса, включающего ту же таблицу, вы можете столкнуться с пресловутой ошибкой «Невозможно указать целевую таблицу для обновления в предложении FROM». В этой статье мы рассмотрим несколько способов устранения этой ошибки и успешного обновления таблицы с помощью оператора выбора, включающего ту же таблицу.
Метод 1: использование временной таблицы
Один из способов обойти ошибку — создать временную таблицу, в которой будут храниться результаты подзапроса, а затем использовать ее для обновления целевой таблицы. Вот пример:
CREATE TEMPORARY TABLE temp_table AS (SELECT * FROM target_table WHERE condition);
UPDATE target_table SET column = new_value WHERE primary_key_column IN (SELECT primary_key_column FROM temp_table);
Метод 2: использование производной таблицы
Другой метод — использовать производную таблицу в операторе обновления. Это включает в себя встраивание подзапроса в другой блок запроса, что позволяет вам ссылаться на производную таблицу в операторе обновления. Вот пример:
UPDATE target_table
SET column = new_value
WHERE primary_key_column IN (
SELECT primary_key_column
FROM (SELECT * FROM target_table WHERE condition) AS derived_table
);
Метод 3: использование оператора JOIN
Третий метод предполагает использование оператора JOIN для обновления целевой таблицы на основе соединения с подзапросом. Этот подход особенно полезен, когда вам нужно обновить несколько столбцов. Вот пример:
UPDATE target_table
JOIN (SELECT * FROM target_table WHERE condition) AS subquery
ON target_table.primary_key_column = subquery.primary_key_column
SET target_table.column1 = subquery.new_value1,
target_table.column2 = subquery.new_value2;
Метод 4: использование переменной
Если вы обновляете одну строку, вы можете использовать переменную для хранения значения из подзапроса, а затем обновить целевую таблицу с помощью этой переменной. Вот пример:
SET @temp := (SELECT column FROM target_table WHERE condition LIMIT 1);
UPDATE target_table SET column = new_value WHERE column = @temp;
Обновление той же таблицы из оператора выбора, включающего ту же таблицу в MySQL, может быть затруднено из-за ошибки «Невозможно указать целевую таблицу для обновления в предложении FROM». Однако, используя такие методы, как использование временной таблицы, производной таблицы, оператора JOIN или переменных, вы можете преодолеть эту ошибку и успешно обновить таблицу. Не забудьте выбрать метод, который соответствует вашим конкретным требованиям и схеме базы данных.