This error occurs in cases such as the following, which
attempts to modify a table and select from the same table in
the subquery:

UPDATE t1 SET column2 = (SELECT MAX(column1) FROM t1);

You can use a subquery for assignment within an
UPDATE statement because
subqueries are legal in
UPDATE and
DELETE statements as well as
in SELECT statements.
However, you cannot use the same table (in this case, table
t1) for both the subquery
FROM clause and the update target.

For transactional storage engines, the failure of a subquery
causes the entire statement to fail. For nontransactional
storage engines, data modifications made before the error was
encountered are preserved.

User Comments

Wanting to copy a longtext field from one record to another, I first tried: Update table set list=(select list from t1 where recno=230) where recno=169 I expected this to select one value from record 230 and copy it into record 169. Instead it fails with Error 1093. Even though this is a single scalar value, MySQL will not let you use the same table in both the update and from parts.

I got the desired result using a temp variable and two queries: Set @Guy = (select list from t1 where recno=230); Update t1 set list=@Guy where recno=169

Note that the semicolon separates the two statements (in phpMyAdmin). Since the temp variable is connection specific, the two queries must be run together.

When I try to run update query for my table "comments", MySQL returns the #1093 - You can't specify target table 'comments' for update in FROM clause message. My contrived table structure and update query are as follow:

Is there any easy way to work around the #1093 - You can't specify target table 'comments' for update in FROM clause error?

Answer No: 156Actually, your above update query seems illegal as per SQL standard. MySQL does not allow to UPDATE or DELETE a table's data if you're simultaneously reading that same data with a subquery. Because you are doing so that is why MySQL tersely said its such error message. Therefore, you will have to rewrite your above update query.

Since MySQL materializes sub queries in the FROM Clause as temporary tables, wrapping the subquery into another inner subquery in the FROM Clause causes it to be executed and stored into a temporary table, then referenced implicitly in the outer subquery. So, the update query will succeed by rewriting it like below:

UPDATE comments SET phrase =( SELECT phrase FROM ( SELECT * FROM comments) AS c1 WHERE c1.uid=2 AND c1.id=2 ) WHERE id =3;

Well, I'd a scenario where I'd a table with one BLOB field to store images. I'd about 3000 records in the database. For first, we needed a default image for all these 3000 records. So, I inserted an image into the table using phpmyadmin for the first record. Now, what I wanted to do was to copy this image from first record and update (paste) all the 2999 records instead of uploading the image for each record. I tried hard to find a solution. Asked many friends, but none of them had the answer. Eventually, I'd to create a copy of that table and then run the following query : update table1 set image = (select image from table2 where id=1)

This worked for me ! This is the fastest and easiest way to do it. If anyone else has a better way to do it, do let me know.