You can't specify target table for update in FROM clause

前端 未结 11 1360
野趣味
野趣味 2020-11-21 22:46

I have a simple mysql table:

CREATE TABLE IF NOT EXISTS `pers` (
  `persID` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(35) NOT NULL,
  `gehalt` int(11         


        
11条回答
  •  一整个雨季
    2020-11-21 23:07

    The problem is that MySQL, for whatever inane reason, doesn't allow you to write queries like this:

    UPDATE myTable
    SET myTable.A =
    (
        SELECT B
        FROM myTable
        INNER JOIN ...
    )
    

    That is, if you're doing an UPDATE/INSERT/DELETE on a table, you can't reference that table in an inner query (you can however reference a field from that outer table...)


    The solution is to replace the instance of myTable in the sub-query with (SELECT * FROM myTable), like this

    UPDATE myTable
    SET myTable.A =
    (
        SELECT B
        FROM (SELECT * FROM myTable) AS something
        INNER JOIN ...
    )
    

    This apparently causes the necessary fields to be implicitly copied into a temporary table, so it's allowed.

    I found this solution here. A note from that article:

    You don’t want to just SELECT * FROM table in the subquery in real life; I just wanted to keep the examples simple. In reality, you should only be selecting the columns you need in that innermost query, and adding a good WHERE clause to limit the results, too.

提交回复
热议问题